2016-02-20 12 views
0

Шаги по воспроизведению:окна Winsock2 гнездо возврата 10014 WSAEFAULT из WSAGetLastError (ipv4/ipv6 связанные)

  1. Создание IPv6 сокет AF_INET6/SOCK_DGRAM/UDP
  2. Bind сокет в адрес IPv6
  3. Использование SENDTO (...) WinSocket API, но указать IPv4 сокет AF_INET семейный адрес адрес для отправки

Winsock2 API вернет WSAEFAULT с WSAGetLastError.

+1

Лучше было бы указать AF_INET6 для семейного аргумента, и использовать sockaddr_in6, но в этом STRUCT месте IPv4-отображенного IPv6-адрес (как описанный здесь: http://www.tcpipguide.com/free/t_IPv6IPv4AddressEmbedding-2.htm). Это дает вам IPv6-сокет, который, тем не менее, взаимодействует через IPv4 и работает хорошо. –

ответ

1

Если вы попытаетесь отправить UDP-пакет на IPv4-адрес с помощью сокета IPv6, sendto() сообщит об ошибке WSAEFAULT. Такое поведение описывается MSDN:

sendto function

Возвращаемого значение

Если не происходит никакой ошибки, SendTo возвращает общее число переданных байт, которое может быть меньше, чем число, обозначенного LEN. В противном случае возвращается значение SOCKET_ERROR, и конкретный код ошибки можно получить, вызвав WSAGetLastError.

...

WSAEFAULT
ЬиЕ или параметры не являются частью адресного пространства пользователя, или Толен параметр слишком мал.

Технически это правда, потому что адрес IPv4 меньше, чем адрес IPv6. Возможно, было бы немного неверно думать, что sizeof был неправильным, когда на самом деле это неправильное семейство адресов, и поэтому sizeof представляет неправильный размер для использования.

Смотрите также коды ошибок окна здесь:

Windows Sockets Error Codes

 Смежные вопросы

  • Нет связанных вопросов^_^