2016-02-20 33 views
0

重現步驟:窗口Winsock2的插座從WSAGetLastError(的IPv4/IPv6相關)返回10014 WSAEFAULT

  1. 創建IPv6套接字AF_INET6/SOCK_DGRAM/UDP
  2. 綁定套接字爲IPv6地址
  3. 使用的sendto (...)WINSOCKET API,但指定一個IPv4 插座AF_INET家庭地址的地址發送到

的Winsock2 API將返回WSAEFAULT與WSAGetLastError。

+1

一個更好的方法是指定AF_INET6爲家庭糾紛,並使用sockaddr_in6的,但在結構代替IPv4映射的IPv6地址(如這裏描述:http://www.tcpipguide.com/free/t_IPv6IPv4AddressEmbedding-2.htm)。這爲您提供了一個IPv6套接字,但它仍然通過IPv4進行通信,並且運行良好。 –

回答

1

如果您嘗試使用IPv6套接字將UDP數據包發送到IPv4地址,則sendto()將報告WSAEFAULT錯誤。此行爲是由MSDN描述:

sendto function

返回值

如果沒有錯誤發生,SENDTO返回的字節發送的總數量,其可以是小於由LEN指示的數目。否則,返回SOCKET_ERROR的值,並通過調用WSAGetLastError來檢索特定的錯誤代碼。

...

WSAEFAULT
的BUF或參數不是用戶地址空間,或 的tolen參數太小的一部分。

從技術上講,這是真的,因爲IPv4地址小於IPv6地址。如果sizeof實際上使用了錯誤的地址族,並且因此sizeof代表使用的大小錯誤,則認爲sizeof錯誤可能有點誤導。

也請參閱Windows錯誤代碼這裏:

Windows Sockets Error Codes