windows winsock2套接字从WSAGetLastError返回10014 WSAEFAULT(与ipv4 / ipv6相关)

时间:2016-02-20 20:27:11

标签: windows sockets sendto

重现的步骤:

  1. 创建IPv6套接字AF_INET6 / SOCK_DGRAM / UDP
  2. 将套接字绑定到IPv6地址
  3. 使用sendto(...)winsocket API但指定IPv4 套接字AF_INET家庭地址发送到
  4. Winsock2 API将使用WSAGetLastError返回WSAEFAULT。

1 个答案:

答案 0 :(得分:2)

如果您尝试使用IPv6套接字将UDP数据包发送到IPv4地址,sendto()将报告WSAEFAULT错误。 MSDN描述了此行为:

sendto function

  

返回值

     

如果没有发生错误,sendto将返回发送的总字节数,该字节数可能小于len指示的数字。否则,返回值SOCKET_ERROR,并且可以通过调用WSAGetLastError来检索特定的错误代码。

     

...

     

WSAEFAULT
  buf或to参数不是用户地址空间的一部分,或   tolen参数太小

从技术上讲,这是正确的,因为IPv4地址小于IPv6地址。如果认为sizeof错误,实际上使用了错误的地址族,那么可能有点误导,因此sizeof代表了错误的使用大小。

另请参阅此处的Windows错误代码:

Windows Sockets Error Codes