Приа работе программка шлёт запрос на хттп сервер и получает ответ. То есть через сниффер есть, что ответ от сервер приходит, но программка его не читает из сокета, почему не могу понять. Спасибо. Код (Text): .486 .model flat,stdcall option casemap:none include c:\masm32\include\windows.inc include c:\masm32\include\user32.inc include c:\masm32\include\kernel32.inc include c:\masm32\include\wsock32.inc include c:\masm32\include\comctl32.inc includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib includelib c:\masm32\lib\comctl32.lib includelib c:\masm32\lib\wsock32.lib _T macro p1, p2 ;макрос обработки строк local l ifb <p2>; Строка без имени .data l db p1, 0 .code exitm <addr l> else ; Строка с именем .data p1 db p2, 0 .code exitm <addr p1> endif endm .data wsaError db "UNCONNECTED!",0 Hello db "ERROR",0 CommandLine dd ? hSocket1 dd ? Port dd 80 flag dd ? sizetoread dd ? buffer dd ? mHandle dd ? HTMLfile db "session.txt",0 filehandle dd ? wsa WSADATA <> sin sockaddr_in <?> ; -.-.- HTMLget db "GET /i/admin/login.php HTTP/1.1",13 db "Host: 192.168.0.1",13 db "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1;" db " ru; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12",13 db "Accept: text/xml,application/xml,application/xhtml+xml," db "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",13 db "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3",13 db "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7",13 db "Keep-Alive: 300",13 db "Connection: keep-alive",13 db "If-Modified-Since: Mon, 23 Oct 2006 11:20:40 GMT",13 db "Cache-Control: max-age=0",13,10,13,10, 0 HTMLgetSize = ($-HTMLget) .code start: invoke WSAStartup, 101h, addr wsa ; инициализация WINSOCK DLL v1.1 .if eax == NULL ; если успешно invoke GetCommandLine ; получить адрес командной строки - не используется mov CommandLine, eax .endif invoke socket, AF_INET, SOCK_STREAM, 0 mov hSocket1, eax ;запоминаем дескриптор сокета .if (eax == SOCKET_ERROR) ;если не всё ок invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP .endif invoke GetCommandLine ; получить адрес командной строки - не используется mov CommandLine, eax ; преобразовываем номер порта в сетевой порядок байт invoke htons, Port mov sin.sin_port, ax mov sin.sin_family, AF_INET ;семейство используемых протоколов для интернет "AF_INET" invoke inet_addr, _T("10.8.0.1") ; конвертируем строковый формат в IP-адрес mov sin.sin_addr, eax ;загружаем IP в параметр структуры ; подключаем созданный сокет к указанному в sin IP- адресу invoke connect, hSocket1, addr sin, sizeof sin ;дескриптор сокета, адрес и порт удалённого узла и размер структуры .if (eax == SOCKET_ERROR) ;ошибка небеда :) invoke WSAGetLastError ; уточняем ошибку :) .if (eax != WSAEWOULDBLOCK) && (eax != WSAEINPROGRESS) ;ресурс временно недоступен, действие в процессе развития invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP ;ошибки :) .endif .endif invoke send, hSocket1,addr HTMLget, HTMLgetSize, 0 .if eax == SOCKET_ERROR ; если получена ошибка (например, нет связи) invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP .endif invoke ioctlsocket,hSocket1,FIONREAD,addr sizetoread .IF eax==NULL invoke GlobalAlloc,GMEM_FIXED,sizetoread ; allocate memory enough for the data to read from the socket mov mHandle,eax invoke GlobalLock,eax mov buffer,eax invoke recv,hSocket1,buffer,sizetoread,0 ; Read the data from the socket .ELSE invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP .endif .if eax==SOCKET_ERROR invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP .else ;;;;;;;;;;;;;;;;;;;;;;Создаём файл-форму;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; invoke CreateFile, addr HTMLfile, GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0 mov filehandle,eax invoke WriteFile, filehandle, buffer, 100000d, 0,0 invoke CloseHandle,filehandle .endif invoke GlobalUnlock,buffer invoke GlobalFree,mHandle ;=================================================== ; mov flag,eax ;.while flag !=0 ; invoke send, hSocket1, addr HTMLget, HTMLgetSize, 0 ; .if eax == SOCKET_ERROR ; если получена ошибка (например, нет связи) ; invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP ; ret ; .endif ; invoke Sleep, 1000 ; ;.endw ;invoke Sleep, 1000 ;закрываем сокеты и подчищаем invoke closesocket, hSocket1 invoke WSACleanup invoke ExitProcess, 0 ret end start
Проверь не только что возвращает ioctlsocket, но и sizetoread равно-ли нулю или нет. А вообще, лучше юзать вместе с select. Код (Text): selected proc sock,timeout:DWORD local fd:fd_set local to:timeval push timeout pop to.tv_sec mov to.tv_usec,0 mov fd.fd_count,1 lea eax,fd.fd_array push sock pop [eax] invoke select,0,addr fd,0,0,addr to ret selected endp и Код (Text): local buffer[1456]:byte invoke GlobalAlloc,40h,1000000h mov esi,eax @@: invoke selected,sock,5 .if eax > 0 invoke RtlZeroMemory,addr buffer,sizeof buffer invoke recv,sock,addr buffer,sizeof buffer,0 cmp eax,1 jl @F invoke lstrcat,esi,addr buffer jmp @B .endif @@: ;сохраняешь esi в файл invoke GlobalFree,esi
Проверил sizetoread после Код (Text): invoke ioctlsocket,hSocket1,FIONREAD,addr sizetoread Равен нулю. почему не понимаю. И ещё не ясный момент, при работе программы мой zonealarm говорит что попытка подключения к 127.0.0.1:30606 Flasher Спасибо, но я в сокетоводстве настолько нуб, что буду не против, если оюъяснишь суть кусочков кода , которые ты привёл. Точнее как это может мне помочь и от каких багов они могут защищать. спасибо