Проблема с чтением из сокета

Тема в разделе "WASM.BEGINNERS", создана пользователем lust, 20 мар 2008.

  1. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Приа работе программка шлёт запрос на хттп сервер и получает ответ. То есть через сниффер есть, что ответ от сервер приходит, но программка его не читает из сокета, почему не могу понять. Спасибо.
    Код (Text):
    1.     .486
    2.     .model flat,stdcall
    3.     option casemap:none
    4.  
    5. include c:\masm32\include\windows.inc
    6. include c:\masm32\include\user32.inc
    7. include c:\masm32\include\kernel32.inc
    8. include c:\masm32\include\wsock32.inc
    9. include c:\masm32\include\comctl32.inc
    10.  
    11. includelib c:\masm32\lib\user32.lib
    12. includelib c:\masm32\lib\kernel32.lib
    13. includelib c:\masm32\lib\comctl32.lib  
    14. includelib c:\masm32\lib\wsock32.lib
    15.  
    16. _T macro p1, p2 ;макрос обработки строк
    17.       local l
    18.         ifb <p2>; Строка без имени
    19.             .data
    20.                 l   db p1, 0
    21.             .code
    22.             exitm   <addr l>
    23.         else    ; Строка с именем
    24.             .data
    25.                 p1  db p2, 0
    26.             .code
    27.             exitm   <addr p1>
    28.         endif
    29. endm
    30.  
    31. .data
    32. wsaError    db "UNCONNECTED!",0
    33. Hello       db "ERROR",0
    34. CommandLine dd  ?
    35. hSocket1    dd  ?
    36. Port        dd 80  
    37. flag        dd  ?
    38. sizetoread  dd ?
    39. buffer      dd ?
    40. mHandle     dd ?
    41. HTMLfile    db "session.txt",0
    42. filehandle  dd ?
    43.  
    44.  
    45. wsa WSADATA <>
    46. sin         sockaddr_in <?> ; -.-.-
    47.  
    48.  
    49. HTMLget db  "GET /i/admin/login.php HTTP/1.1",13
    50.     db  "Host: 192.168.0.1",13
    51.     db  "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1;"
    52.     db  " ru; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12",13
    53.     db  "Accept: text/xml,application/xml,application/xhtml+xml,"
    54.     db  "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",13
    55.     db  "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3",13
    56.     db  "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7",13
    57.     db  "Keep-Alive: 300",13
    58.     db  "Connection: keep-alive",13
    59.     db  "If-Modified-Since: Mon, 23 Oct 2006 11:20:40 GMT",13
    60.     db  "Cache-Control: max-age=0",13,10,13,10,  0
    61. HTMLgetSize = ($-HTMLget)
    62.  
    63. .code
    64.  
    65. start: 
    66.  
    67. invoke WSAStartup, 101h, addr wsa   ; инициализация  WINSOCK DLL v1.1
    68. .if eax == NULL             ; если успешно
    69.     invoke GetCommandLine       ; получить адрес командной строки - не используется
    70.     mov    CommandLine, eax    
    71. .endif
    72. invoke  socket, AF_INET, SOCK_STREAM, 0
    73.     mov     hSocket1, eax               ;запоминаем дескриптор сокета
    74. .if (eax == SOCKET_ERROR)           ;если не  всё ок
    75.     invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP              
    76. .endif
    77.         invoke GetCommandLine       ; получить адрес командной строки - не используется
    78.         mov    CommandLine, eax
    79.                 ; преобразовываем номер порта в сетевой порядок байт
    80.                 invoke  htons, Port
    81.                 mov     sin.sin_port, ax
    82.                 mov     sin.sin_family, AF_INET         ;семейство используемых протоколов для интернет  "AF_INET"
    83.                 invoke  inet_addr, _T("10.8.0.1")       ; конвертируем строковый формат в IP-адрес
    84.                 mov     sin.sin_addr, eax           ;загружаем IP в параметр структуры
    85.                
    86.         ; подключаем созданный сокет к указанному в sin IP- адресу
    87.                 invoke  connect, hSocket1, addr sin, sizeof sin     ;дескриптор сокета, адрес и порт удалённого узла и размер структуры
    88.                
    89.         .if (eax == SOCKET_ERROR)               ;ошибка небеда :)
    90.                     invoke  WSAGetLastError             ; уточняем ошибку :)
    91.                     .if (eax != WSAEWOULDBLOCK) && (eax != WSAEINPROGRESS)                  ;ресурс временно недоступен, действие  в процессе развития
    92.                         invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP         ;ошибки :)
    93.                     .endif
    94.                 .endif
    95.         invoke send, hSocket1,addr HTMLget, HTMLgetSize, 0  
    96.         .if eax == SOCKET_ERROR ; если получена ошибка (например, нет связи)
    97.             invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP        
    98.         .endif
    99.        
    100.         invoke ioctlsocket,hSocket1,FIONREAD,addr sizetoread
    101.         .IF eax==NULL
    102.            
    103.             invoke GlobalAlloc,GMEM_FIXED,sizetoread      ; allocate memory enough for the data to read from the socket
    104.                     mov mHandle,eax
    105.                     invoke GlobalLock,eax
    106.                     mov buffer,eax
    107.                     invoke recv,hSocket1,buffer,sizetoread,0    ; Read the data from the socket
    108.         .ELSE
    109.             invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP
    110.         .endif
    111.         .if eax==SOCKET_ERROR
    112.                         invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP
    113.                 .else
    114.        
    115. ;;;;;;;;;;;;;;;;;;;;;;Создаём файл-форму;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    116.     invoke CreateFile, addr HTMLfile, GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    117.     mov filehandle,eax
    118.     invoke WriteFile, filehandle, buffer, 100000d, 0,0
    119.     invoke CloseHandle,filehandle
    120.                 .endif
    121.        
    122.         invoke GlobalUnlock,buffer
    123.                 invoke GlobalFree,mHandle
    124. ;===================================================
    125. ;       mov flag,eax           
    126. ;.while flag !=0  
    127. ;          invoke send, hSocket1, addr HTMLget, HTMLgetSize, 0
    128. ;     .if eax == SOCKET_ERROR   ; если получена ошибка (например, нет связи)
    129. ;           invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP        
    130. ;           ret
    131. ;     .endif
    132. ;          invoke Sleep, 1000
    133. ;    
    134. ;.endw
    135. ;invoke Sleep, 1000            
    136. ;закрываем сокеты и подчищаем
    137.  
    138.  
    139. invoke closesocket, hSocket1
    140. invoke WSACleanup
    141. invoke ExitProcess, 0
    142.  
    143. ret
    144. end start
     
  2. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Проверь не только что возвращает ioctlsocket, но и sizetoread равно-ли нулю или нет.
    А вообще, лучше юзать вместе с select.

    Код (Text):
    1. selected proc sock,timeout:DWORD
    2.      local fd:fd_set
    3.      local to:timeval
    4.        push timeout
    5.        pop to.tv_sec
    6.        mov to.tv_usec,0
    7.        mov fd.fd_count,1
    8.        lea eax,fd.fd_array
    9.        push sock
    10.        pop [eax]
    11.        invoke select,0,addr fd,0,0,addr to
    12.        ret
    13. selected endp
    и
    Код (Text):
    1.      local buffer[1456]:byte
    2.  
    3.         invoke GlobalAlloc,40h,1000000h
    4.         mov esi,eax
    5.      @@:
    6.         invoke selected,sock,5
    7.          .if eax > 0
    8.            invoke RtlZeroMemory,addr buffer,sizeof buffer
    9.            invoke recv,sock,addr buffer,sizeof buffer,0
    10.             cmp eax,1
    11.             jl @F
    12.            invoke lstrcat,esi,addr buffer
    13.            jmp @B
    14.         .endif
    15.      @@:
    16.      
    17.         ;сохраняешь esi в файл
    18.        
    19.         invoke GlobalFree,esi
     
  3. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Проверил sizetoread после
    Код (Text):
    1. invoke ioctlsocket,hSocket1,FIONREAD,addr sizetoread
    Равен нулю. почему не понимаю.

    И ещё не ясный момент, при работе программы мой zonealarm говорит что попытка подключения к 127.0.0.1:30606


    Flasher
    Спасибо, но я в сокетоводстве настолько нуб, что буду не против, если оюъяснишь суть кусочков кода , которые ты привёл. Точнее как это может мне помочь и от каких багов они могут защищать.

    спасибо