Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2012, 13:35   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию WinSock в asm

Добрый день. Пытаюсь сделать клиент-сервер на ассемблере. При вызове функция connect возвращает -1. Хочу подключиться к серверу Яндекса. Знаю, что "Система оповещения", то бишь MessageBox сделаны криво, но получить нужную информацию с них удается, хотя сначала показывается положительное сообщение, а за ним - отрицательное. Основной вопрос: почему
Код:
invoke connect,[handlesock],socketaddr,sizeof.sockaddr_in
возвращает -1(ошибку). Думал, что вся проблема в sizeof.sockaddr_in, но нет. Размер структуры 16 и замена sizeof на константу ничего не меняет.
Заранее благодарю.

ADD(забыл код)
Код:
include '%fasminc%/win32ax.inc'
.data
struc   SOCKADDR
{
        .sin_family      dw      0               ; âñåãäà AF_INET
        .sin_port        dw      0               ; ïîpò
        .sin_addr        dd      0               ; àäpåñ ñåpâåpà
        .sin_zero        db      8 dup(0)        ; íå èñïîëüçóåòñÿ
}
cWritten          dd 0
wsadata           WSADATA
socketaddr        SOCKADDR
handlesock        dd 0
ifmt              db '%d',0
buf               db 15 dup(0)
Caption           db 'Внимание',0
Erro              db 'Сокеты не инициализированы',0
ok                db 'Сокеты инициализированы',0
PORT              dw 80d
SERVER            db 'yandex.ru',0
.code
start:
        invoke WSAStartup, 0101h,wsadata
        cmp eax,0
;        invoke wsprintf,buf,ifmt,eax
;        invoke MessageBox,0,buf,Caption,MB_OK
        jnz erM
        invoke MessageBox,0,ok,Caption,MB_OK
        jmp NoEr
erM:    invoke MessageBox,0,Erro,Caption,MB_OK
        jmp endpr

NoEr:   invoke socket,02h,01h,0 ;invoke socket, AF_INET(2h),SOCK_STREAM(1h),PCL_NONE(0)
        cmp eax,-1
        jz erM
        mov [handlesock],eax
        invoke htons,PORT
        mov [socketaddr.sin_port],ax
        invoke gethostbyname, SERVER
        cmp eax,0
        jz erM
        mov eax,DWORD[eax+10h]
        mov eax,eax
        mov DWORD[socketaddr.sin_addr],eax
        invoke connect,[handlesock],socketaddr,sizeof.sockaddr_in
        cmp eax, -1
        jz erM
endpr:  invoke ExitProcess,0
.end start

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 02.06.2012 в 13:37.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 02.06.2012, 22:00   #2
litrovith
Пользователь
 
Регистрация: 15.07.2008
Сообщений: 28
По умолчанию

Код:
PORT              equ 80d
invoke htons,PORT
Код:
        invoke gethostbyname, SERVER
        cmp eax,0
        jz erM
        mov eax, [eax+0Ch]
Код:
mov socketaddr.sin_family, AF_INET
и т.п.
litrovith вне форума Ответить с цитированием
Старый 03.06.2012, 16:14   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо Вам огромное.
Цитата:
mov eax, [eax+0Ch]
Не помню, почему же я не так написал.
Цитата:
mov socketaddr.sin_family, AF_INET
Я думаю, что не обязательна это строка. У меня конкретно в структуре 0 присваивается.
Еще раз спасибо.
---
Вот опять. Хочу разложить все по полочкам.
Немного модернизировал код. Теперь все подключается, отправляет сообщение, но на функции recv зависает(проверял MessageBox'ами)
Код:
include '%fasminc%/win32ax.inc'
.data
struc   SOCKADDR
{
        .sin_family      dw      0               ; âñåãäà AF_INET
        .sin_port        dw      0               ; ïîpò
        .sin_addr        dd      0               ; àäpåñ ñåpâåpà
        .sin_zero        db      8 dup(0)        ; íå èñïîëüçóåòñÿ
}
cWritten          dd 0
wsadata           WSADATA
socketaddr        SOCKADDR
handlesock        dd 0
size              dd 0
ifmt              db '%d',0
buf               db 256 dup(0)
Caption           db 'Âíèìàíèå',0
Erro              db 'Îøèáêà! Ñîêåòû íåèíèöèàëèçèðîâàííû',0
ok                db 'Ñîêåòû èíèöèàëèçèðîâàííû',0
snd               db 'GET /index.php HTTP/1.1',13,10,'User-Agent: MyClient',13,10,'Host: www.yandex.ru',13,10
PORT              equ 80
SERVER            db 'yandex.ru',0
.code
start:
        invoke WSAStartup, 0101h,wsadata
        cmp eax,0
;        invoke wsprintf,buf,ifmt,eax
;        invoke MessageBox,0,buf,Caption,MB_OK
        jnz erM
        invoke MessageBox,0,ok,Caption,MB_OK
        jmp NoEr
erM:    invoke MessageBox,0,Erro,Caption,MB_OK
        jmp endpr

NoEr:   invoke socket,02h,01h,0 ;invoke socket, AF_INET(2h),SOCK_STREAM(1h),PCL_NONE(0)
        mov [handlesock],eax
        cmp eax,-1
        jz erM
        invoke htons,PORT
        mov [socketaddr.sin_port],ax
        invoke gethostbyname, SERVER
        cmp eax,0
        jz erM
        mov eax,DWORD[eax+0Ch]
        mov eax,eax
        mov DWORD[socketaddr.sin_addr],eax
       ; mov [socketaddr.sin_family], AF_INET
        invoke connect,[handlesock],socketaddr,sizeof.sockaddr_in
        cmp eax, -1
        jz erM
        invoke lstrlen,snd
        mov [size],eax
        invoke send,[handlesock],snd,[size],0
rv:
        invoke  recv,[handlesock],buf,256,0
        cmp eax, -1
        jz erM
        invoke MessageBox,0,buf,Caption,MB_OK
        jmp rv
endpr:  invoke ExitProcess,0
.end start
Что не так?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 03.06.2012 в 18:23.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 05.06.2012, 21:00   #4
litrovith
Пользователь
 
Регистрация: 15.07.2008
Сообщений: 28
По умолчанию

Цитата:
Сообщение от _PROGRAMM_ Посмотреть сообщение
Я думаю, что не обязательна это строка. У меня конкретно в структуре 0 присваивается.
А должно быть 2.
Код:
        mov eax,DWORD[eax+0Ch]
        mov eax,eax                                               ; ЧТО ЭТО?
        mov DWORD[socketaddr.sin_addr],eax
и т.п.
litrovith вне форума Ответить с цитированием
Старый 11.06.2012, 13:31   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Как ни крути, все равно на recv зависает
Код:
include '%fasminc%/win32ax.inc'
.data
struc   SOCKADDR
{
        .sin_family      dw      2               ; всегда AF_INET
        .sin_port        dw      0               ; поpт
        .sin_addr        dd      0               ; адpес сеpвеpа
        .sin_zero        db      8 dup(0)        ; не используется
}
cWritten          dd 0
wsadata           WSADATA
socketaddr        SOCKADDR
handlesock        dd 0
size              dd 0
ifmt              db '%d',0
buf               db 256 dup(0)
Caption           db 'Внимание',0
Erro              db 'Ошибка! Сокеты неинициализированны',0
ok                db 'Сокеты инициализированны',0
snd               db 'GET /index.php HTTP/1.1',13,10,'User-Agent: MyClient',13,10,'Host: www.yandex.ru',13,10
PORT              equ 80
SERVER            db 'yandex.ru',0
.code
start:
        invoke WSAStartup, 0101h,wsadata
        cmp eax,0
;        invoke wsprintf,buf,ifmt,eax
;        invoke MessageBox,0,buf,Caption,MB_OK
        jnz erM
        invoke MessageBox,0,ok,Caption,MB_OK
        jmp NoEr
erM:    invoke MessageBox,0,Erro,Caption,MB_OK
        jmp endpr

NoEr:   invoke socket,02h,01h,0 ;invoke socket, AF_INET(2h),SOCK_STREAM(1h),PCL_NONE(0)
        mov [handlesock],eax
        cmp eax,-1
        jz erM
        invoke htons,PORT
        mov [socketaddr.sin_port],ax
        invoke gethostbyname, SERVER
        cmp eax,0
        jz erM
        mov eax,DWORD[eax+0Ch]
        mov DWORD[socketaddr.sin_addr],eax
       ; mov [socketaddr.sin_family], AF_INET
        invoke connect,[handlesock],socketaddr,sizeof.sockaddr_in
        cmp eax, -1
        jz erM
        invoke lstrlen,snd
        mov [size],eax
        invoke send,[handlesock],snd,[size],0
rv:
        invoke  recv,[handlesock],buf,1,0
        cmp eax, -1
        jz erM
        cmp eax, 0
        jz erM
        invoke MessageBox,0,buf,Caption,MB_OK
        jmp rv
endpr:  invoke ExitProcess,0
.end start

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 11.06.2012, 21:42   #6
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

До recv у вас дело не доходит. Зависает на коннект.
Во первых - ip адрес получен неверный, точнее он вообще не получен.
Во вторых - запрос клиента должен заканчиваться пустой строкой.
В третьих - функция lstrlen работает с zero termination строками, поэтому вам она неправильный результат выдаст.

Вот для примера, можете поразбираться - это масм:
Вложения
Тип файла: rar sockets.rar (6.7 Кб, 96 просмотров)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 29.06.2012, 11:34   #7
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Вот для примера, можете поразбираться - это масм:
Спасибо огромное. То, что нужно. Извините, не было времени отписаться.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 09.07.2012, 14:10   #8
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Ну вот. Уделил время сокетам. Исправил, надеюсь, ошибки и все равно... Теперь точно зависает на recv. Если написать неправильный запрос, (переменная snd), то яндекс возвращает bad request, а если тот который используется в коде - зависает, и только через время(по-моему так как и положено, через 30 секунд) выбивает ошибку.
Код:
include '%fasminc%/win32ax.inc'
.data
struc   SOCKADDR
{
        .sin_family      dw      0
        .sin_port        dw      0
        .sin_addr        dd      0
        .sin_zero        db      8 dup(0)
}
cWritten          dd 0
wsadata           WSADATA
socketaddr        SOCKADDR
handlesock        dd 0
size              dd 0
ifmt              db '%d',0
buf               db 256 dup(0)
Caption           db 'Âíèìàíèå',0
Erro              db 'Ñîêåòû íå èíèöèàëèçèðîâàíû',0
ok                db 'Ñîêåòû èíèöèàëèçèðîâàíû',0
snd               db 'GET / HTTP/1.0',13,10,'Host: www.yandex.ru',13,10,'User-Agent: Browser',13,10,'Accept: text/html',13,10,'Connection: close',13,10,0
PORT              equ 80
SERVER            db 'www.yandex.ru',0
.code
start:
          invoke WSAStartup, 0101h,wsadata
          cmp eax,0
;         invoke wsprintf,buf,ifmt,eax
;         invoke MessageBox,0,buf,Caption,MB_OK
          jnz erM
          invoke MessageBox,0,ok,Caption,MB_OK
          jmp NoEr
erM:      invoke MessageBox,0,Erro,Caption,MB_OK
          jmp endpr

NoEr:     invoke htons,PORT
          mov [socketaddr.sin_port],ax
          invoke gethostbyname, SERVER
          cmp eax,0
          jz erM
          mov ebx,DWORD[eax+0Ch]
          mov edx,[ebx]
          mov edx,[edx]
          mov DWORD[socketaddr.sin_addr],edx
          mov [socketaddr.sin_family], AF_INET

          invoke socket,02h,01h,0 ;invoke socket, AF_INET(2h),SOCK_STREAM(1h),PCL_NONE(0)
          cmp eax,-1
          jz erM
          mov [handlesock],eax

          invoke connect,[handlesock],socketaddr,sizeof.sockaddr_in
          cmp eax, -1
          jz erM

          invoke lstrlen,snd
          invoke send,[handlesock],snd,eax,0
rv:
            invoke  recv,[handlesock],buf,256,0
            cmp eax, -1
            jz erM
            invoke MessageBox,0,buf,Caption,0
            jmp rv
endpr:  invoke ExitProcess,0
.end start
Что неверно? Запрос, код, или все сразу?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 09.07.2012 в 14:13.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 09.07.2012, 17:40   #9
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

всё сразу.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 09.07.2012, 19:51   #10
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
всё сразу.
Ну а конкретнее? Хочу сделать минимальный сокет. В чем же ошибка? Разбираться начинал по этой статье. Там вообще все просто. Но даже это просто не получается. Ведь Яндекс,как я уже писал, при неправильном запросе отвечает!
Заранее благодарен.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 09.07.2012 в 19:57.
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
winsock lama90 Помощь студентам 0 04.04.2012 00:17
WinSock Slame Работа с сетью в Delphi 5 22.03.2012 10:40
Передача параметров asm-asm Maksimall89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 22.12.2011 11:54
ASM и WinSock Wardrag Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 15 16.08.2010 14:17
WinSock Killbrum Win Api 1 18.10.2009 15:15