Неблокирующий режим и recv -> WSAEWOULDBLOCK

Тема в разделе "WASM.NETWORKS", создана пользователем mc black, 29 май 2010.

  1. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Дописал (как мне казалось) программку http загрузки страницы из интернет при помощи сокета в неблокирующем режиме. Код не работает, не идет никак прием в recv, возвращается только WSAEWOULDBLOCK. Программка от этого тупо подвисает в бесконечном цикле. Поправьте меня, пожалуйста!
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include windows.inc
    6. include kernel32.inc
    7. include wsock32.inc
    8. include masm32.inc
    9. include debug.inc
    10.  
    11. includelib kernel32.lib
    12. includelib wsock32.lib
    13. includelib masm32.lib
    14. includelib debug.lib
    15.    
    16. .data
    17.    
    18.     szHostname db "www.ya.ru",0
    19.     http_request db "GET / HTTP/1.1",13,10,\
    20.     "Host: www.ya.ru",13,10,\
    21.     "User-Agent: socket-c",13,10,13,10,0
    22.    
    23. .code
    24.  
    25. socket_c proc
    26.     LOCAL wsa:WSADATA
    27.     LOCAL ip:DWORD
    28.     LOCAL sock:DWORD
    29.     LOCAL sadr:sockaddr_in
    30.     LOCAL argp:DWORD
    31.     LOCAL buff_sml:DWORD
    32.     LOCAL buff_big:DWORD
    33.     LOCAL buff_lmt:DWORD
    34.     LOCAL buff_cnt:DWORD
    35.     LOCAL recv_cnt:DWORD
    36.    
    37.     invoke WSAStartup,202h,addr wsa
    38.     test eax,eax
    39.     jnz exitproc
    40.    
    41.     invoke gethostbyname,addr szHostname
    42.     test eax,eax
    43.     jz cleanup
    44.     assume eax:ptr hostent
    45.     mov eax,[eax].h_list
    46.     mov eax,dword ptr [eax]
    47.     mov eax,dword ptr [eax]
    48.     mov ip,eax
    49.    
    50.     invoke socket,AF_INET,SOCK_STREAM,0
    51.     test eax,SOCKET_ERROR
    52.     jz cleanup
    53.     mov sock,eax
    54.    
    55.     mov sadr.sin_family,AF_INET
    56.     invoke htons,80
    57.     mov sadr.sin_port,ax
    58.     mov eax,ip
    59.     mov sadr.sin_addr,eax
    60.     invoke RtlZeroMemory,addr sadr.sin_zero,8
    61.     invoke connect,sock,addr sadr,sizeof sadr
    62.     test eax,eax
    63.     jnz cleansock
    64.    
    65.     invoke send,sock,addr http_request,sizeof http_request,0
    66.     test eax,SOCKET_ERROR
    67.     jz cleansock
    68.    
    69.     mov argp,1
    70.     invoke ioctlsocket,sock,FIONBIO,addr argp
    71.     test eax,eax
    72.     jnz cleansock
    73.    
    74.     invoke VirtualAlloc,0,4*1024,MEM_RESERVE,PAGE_READWRITE
    75.     mov buff_sml,eax
    76.     invoke VirtualAlloc,buff_sml,4*1024,MEM_COMMIT,PAGE_READWRITE
    77.    
    78.     invoke VirtualAlloc,0,1*1024*1024,MEM_RESERVE,PAGE_READWRITE
    79.     mov buff_big,eax
    80.     mov buff_lmt,4*1024
    81.     invoke VirtualAlloc,buff_big,buff_lmt,MEM_COMMIT,PAGE_READWRITE
    82.     mov buff_cnt,0
    83.    
    84.     .repeat
    85.         invoke recv,sock,buff_sml,4*1024,0
    86.         mov recv_cnt,eax
    87.         invoke WSAGetLastError
    88.         .if recv_cnt!=0 && eax!=WSAEWOULDBLOCK
    89.             add buff_cnt,eax
    90.             mov eax,buff_lmt
    91.             .while eax<buff_cnt
    92.                 add buff_lmt,4*1024
    93.                 invoke VirtualAlloc,buff_big,buff_lmt,MEM_COMMIT,PAGE_READWRITE
    94.                 mov eax,buff_lmt
    95.             .endw
    96.             mov eax,buff_big
    97.             add eax,buff_cnt
    98.             sub eax,recv_cnt
    99.             invoke RtlMoveMemory,eax,buff_sml,recv_cnt
    100.         .endif
    101.         mov eax,recv_cnt
    102.     .until eax==0
    103.    
    104.     PrintString buff_big
    105.    
    106.     invoke VirtualFree,buff_sml,0,MEM_RELEASE
    107.     invoke VirtualFree,buff_big,0,MEM_RELEASE
    108.    
    109. cleansock:
    110.     invoke closesocket,sock
    111. cleanup:
    112.     invoke WSACleanup
    113. exitproc:
    114.     ret
    115. socket_c endp
    116.  
    117. start:
    118.    
    119.     invoke socket_c
    120.     invoke ExitProcess,0
    121.    
    122. end start