WSASendto WSAEFAULT(10014)

Тема в разделе "WASM.NETWORKS", создана пользователем like, 29 янв 2009.

  1. like

    like New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2008
    Сообщения:
    21
    Адрес:
    Чебоксары
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include d:\masm32\include\windows.inc
    6. include d:\masm32\include\kernel32.inc
    7. include d:\masm32\include\user32.inc
    8. include d:\masm32\include\masm32.inc
    9. include d:\masm32\include\advapi32.inc
    10. include d:\masm32\include\ws2_32.inc
    11.  
    12. includelib d:\masm32\lib\kernel32.lib
    13. includelib d:\masm32\lib\user32.lib
    14. includelib d:\masm32\lib\masm32.lib
    15. includelib d:\masm32\lib\advapi32.lib
    16. includelib d:\masm32\lib\ws2_32.lib
    17.  
    18. .data
    19. buf db "!",0
    20. dest_ip db "127.0.0.1",0
    21. err db "Error",0
    22. succ db "Success",0
    23. err_create db "WSASocket error",0
    24. err_sendto db "WSASendTo error",0
    25.  
    26. .data?
    27. ws WSADATA <>
    28. udp_socket SOCKET <>
    29. peer sockaddr_in <>
    30. wsaol WSAOVERLAPPED <>
    31. wsabuf WSABUF <>
    32. nres dd ?
    33. nerr dd ?
    34.  
    35. .code
    36. start:
    37. invoke WSAStartup,202h,offset ws
    38.  
    39. invoke WSASocket,AF_INET,SOCK_DGRAM,IPPROTO_UDP,NULL,NULL,WSA_FLAG_OVERLAPPED
    40. mov udp_socket,eax
    41.  
    42. .if(eax==INVALID_SOCKET)
    43. invoke WSAGetLastError
    44. invoke dwtoa,eax,offset nerr
    45. invoke MessageBox,NULL,offset nerr,offset err_create,MB_OK
    46. .endif
    47.  
    48. mov peer.sin_family,AF_INET
    49.  
    50. invoke htons,10000
    51. mov peer.sin_port,ax
    52.  
    53. invoke inet_addr,offset dest_ip
    54. mov peer.sin_addr.S_un.S_addr,eax
    55.  
    56. mov wsabuf.len,SIZEOF buf
    57. mov wsabuf.buf,offset buf
    58.  
    59. invoke WSACreateEvent
    60. mov wsaol.hEvent,eax
    61.  
    62. invoke WSASendTo,udp_socket,offset wsabuf,1,offset nres,NULL,offset peer,SIZEOF peer,offset wsaol,NULL
    63.  
    64. .if(eax==SOCKET_ERROR)
    65. invoke WSAGetLastError
    66. invoke dwtoa,eax,offset nerr
    67. invoke MessageBox,NULL,offset nerr,offset err_sendto,MB_OK
    68. .endif
    69.  
    70. invoke WSACloseEvent,wsaol.hEvent
    71.  
    72. invoke closesocket,udp_socket
    73.  
    74. invoke WSACleanup
    75.  
    76. invoke ExitProcess,NULL
    77. end start
    Выдает ошибку блок передачи через WSASendto под номером 10014,нашел на форуме подобную проблему http://wasm.ru/forum/viewtopic.php?id=26704&p=1.
    Там она была решена неоднозначно,хочется найти ответ конкретный.
    Использовать Sendto не предлагать.
     
  2. like

    like New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2008
    Сообщения:
    21
    Адрес:
    Чебоксары
    Правил код слегка
    Код (Text):
    1. ...
    2. sendmsg proc
    3. LOCAL wsabuf:WSABUF
    4.  
    5. mov wsabuf.len,SIZEOF buf
    6. mov wsabuf.buf,offset buf
    7.  
    8. invoke WSASendTo,udp_socket,addr wsabuf,1,offset nres,NULL,offset peer,SIZEOF peer,offset wsaol,NULL
    9.  
    10. sendmsg endp
    11. ...
    Выполняется успешно, в nres возвращает длину буфера - проверил.
    Остается вопрос,why?
     
  3. like

    like New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2008
    Сообщения:
    21
    Адрес:
    Чебоксары
    Для будущих искателей,решение проблемы:
    Код (Text):
    1. ...
    2. .data?
    3. ...
    4. ALIGN DWORD
    5. wsabuf WSABUF <>
    6. ...
    Переменную wsabuf выравниваем на DWORD, в связи с http://rs1.szif.hu/~tomcat/win32/win32asm.txt.Всем спасибо.)
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    есть такое.
    сразу не приметил.