Если вы попытаетесь отправить UDP-пакет на IPv4-адрес с помощью сокета IPv6, sendto()
сообщит об ошибке WSAEFAULT
. Такое поведение описывается MSDN:
sendto function
Возвращаемого значение
Если не происходит никакой ошибки, SendTo возвращает общее число переданных байт, которое может быть меньше, чем число, обозначенного LEN. В противном случае возвращается значение SOCKET_ERROR, и конкретный код ошибки можно получить, вызвав WSAGetLastError.
...
WSAEFAULT
ЬиЕ или параметры не являются частью адресного пространства пользователя, или Толен параметр слишком мал.
Технически это правда, потому что адрес IPv4 меньше, чем адрес IPv6. Возможно, было бы немного неверно думать, что sizeof был неправильным, когда на самом деле это неправильное семейство адресов, и поэтому sizeof представляет неправильный размер для использования.
Смотрите также коды ошибок окна здесь:
Windows Sockets Error Codes
Лучше было бы указать AF_INET6 для семейного аргумента, и использовать sockaddr_in6, но в этом STRUCT месте IPv4-отображенного IPv6-адрес (как описанный здесь: http://www.tcpipguide.com/free/t_IPv6IPv4AddressEmbedding-2.htm). Это дает вам IPv6-сокет, который, тем не менее, взаимодействует через IPv4 и работает хорошо. –