首页 文章

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

提问于
浏览
0

重现步骤:

  • 创建IPv6套接字AF_INET6 / SOCK_DGRAM / UDP

  • 将套接字绑定到IPv6地址

  • 使用sendto(...)winsocket API,但指定要发送到的IPv4套接字AF_INET系列地址

Winsock2 API将使用WSAGetLastError返回WSAEFAULT .

1 回答

  • 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

相关问题