Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с recv в Winsock 
:(
    Опции темы
hintRUS
Дата 3.11.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.7.2006

Репутация: нет
Всего: нет



MASM32.
Начал разбираться с winsock, брал информацию с MSDN + смотрел примеры в готовых программах. В итоге получился код:
Код

.386
.model flat, stdcall
option casemap:none

include C:\masm32\include\windows.inc
include C:\masm32\include\kernel32.inc
includelib C:\masm32\lib\kernel32.lib
include C:\masm32\include\user32.inc
includelib C:\masm32\lib\user32.lib
include C:\masm32\include\wsock32.inc
includelib C:\masm32\lib\wsock32.lib
include C:\masm32\include\advapi32.inc
includelib C:\masm32\lib\advapi32.lib
include C:\masm32\include\masm32.inc
includelib C:\masm32\lib\masm32.lib


.data
hsock dd 0
myHost db "10.0.200.244",0
mes db "hello",0
myPort dd 80
http db "GET / HTTP/1.1",13,10,"Host:ftpsearch.starnet",13,10,13,10,0
rbyte dd 0
.data?
    wsadata WSADATA <>
    sockopt sockaddr_in <>
    buff dd ?
.code

start:

invoke WSAStartup,101h,addr wsadata
invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
mov hsock,eax
mov sockopt.sin_family,AF_INET

invoke inet_addr,addr myHost
mov sockopt.sin_addr,eax

invoke htons,myPort
mov sockopt.sin_port,ax

invoke connect,hsock,addr sockopt,sizeof sockopt

INVOKE    lstrlen, addr http
invoke send,hsock,offset http,eax,NULL

invoke recv, hsock,buff,100,NULL

.IF eax==0          
    invoke closesocket, hsock    
    ret
.ELSEIF eax==SOCKET_ERROR
    invoke closesocket, hsock
    invoke MessageBox, NULL,,NULL,MB_OK
    ret
.ELSE         
    mov       rbyte,eax
    invoke MessageBox, NULL,buff,rbyte,MB_OK
.ENDIF         
     
invoke closesocket,hsock
invoke ExitProcess,NULL

end start

и оно всегда "вылетает" на "invoke MessageBox, NULL,,NULL,MB_OK", т.е. recv возвращает SOCKET_ERROR.
Посмотрел трафик сниферов - все нормально, ответ приходит.
В отладчике LastErr: WSAECONNABORTED (00002745).
Что я написал неверно?
p.s. про то что коннект у меня только по ip (по хосту не пойдет) знаю.
p.s.s. интересует реализация именно на winsock, http - просто первое что пробую, дальше может быть любой протокол.
PM MAIL   Вверх
dumb
Дата 3.11.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



что сразу попалось на глаза:
Код

.data?
...
    buff dd 1000h dup ?
.code
...
invoke recv, hsock,ADDR buff,sizeof buff,NULL
...

и в нижеследующем MessageBox'e та же ошибка.
PM MAIL   Вверх
hintRUS
Дата 6.11.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.7.2006

Репутация: нет
Всего: нет



Еще одна проблема с winsock'ом:

Код

.386
.model flat, stdcall
option casemap:none

include C:\masm32\include\windows.inc
include C:\masm32\include\kernel32.inc
includelib C:\masm32\lib\kernel32.lib
include C:\masm32\include\user32.inc
includelib C:\masm32\lib\user32.lib
include C:\masm32\include\wsock32.inc
includelib C:\masm32\lib\wsock32.lib
include C:\masm32\include\advapi32.inc
includelib C:\masm32\lib\advapi32.lib
include \masm32\include\masm32.inc
includelib \masm32\lib\masm32.lib


.data
hsock dd 0
myHost db "10.0.200.244",0
mes db "hello",0
myPort dd 80
http db "GET / HTTP/1.1",13,10,"Host:ftpsearch.starnet",13,10,13,10,0
rbyte dd 0
qw db "Bye-bye!",0


.data?
    wsadata WSADATA <>
    sockopt sockaddr_in <>
    buff dd ?
    
.code

start:

invoke WSAStartup,101h,addr wsadata
invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
mov hsock,eax

mov sockopt.sin_family,AF_INET

invoke inet_addr,addr myHost
mov sockopt.sin_addr,eax

invoke htons,myPort
mov sockopt.sin_port,ax

invoke connect,hsock,addr sockopt,sizeof sockopt

INVOKE    lstrlen, addr http
invoke send,hsock,offset http,eax,NULL


@get:
invoke recv, hsock,offset buff,2048,NULL ; ***
.IF    eax == 0 || eax == SOCKET_ERROR
    jmp @quit
.ELSE
    invoke    MessageBoxA,0,offset buff,offset myHost,0
    jmp @get
.endif
    

@quit:
invoke    MessageBoxA,0,offset qw,offset qw,0
invoke closesocket,hsock
invoke ExitProcess,NULL
end start

После получения данных проверяю eax (длинна полученного), в первый раз в отладчике вижу что ebx!=0 (=кол-ву данных) и все ок, и моё условие в IF не выолняется, а выводятся полученные данные и происходит переход на @get. Второй раз данных нету, ebx=0, но переход на @quit происходит с видимой задержкой в 1-2 секунды. Почему?
PM MAIL   Вверх
dumb
Дата 8.11.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



за первый вызов recv вычитываются все данные, а при втором вызове в recv происходит приостановка, так как сокет блокирующий, а данных больше нет. потом(через пару секунд) сервер разрывает соединение, и recv возвращает 0, что означает закрытие соединения. читай спраУку
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0799 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.