使用getsockname函数时出现WSAEFAULT错误

时间:2013-01-31 11:16:41

标签: c++ winapi winsock2

使用getsockname功能时遇到问题。我有这段代码:

struct sockaddr sa;
int sa_len;
sa_len = sizeof(sa);
if (getsockname(socketfd, &sa, &sa_len) != SOCKET_ERROR)
{
   ///
}
else
{
   int error = WSAGetLastError();
   //error here WSAEFAULT always
}

如您所见,使用getsockname函数时总是出错。错误 - WSAEFAULT。但为什么?结构和结构大小是正确的,为什么会发生这种情况?

WSAEFAULT desc:

  

name或namelen参数不是用户的有效部分   地址空间,或者namelen参数太小。

P.S。应用程序是64位

谢谢!

2 个答案:

答案 0 :(得分:4)

您的struct sockaddr太小,无法接受套接字地址。要么使用适当大小的结构,例如struct sockaddr_in,要么更好,使用struct sockaddr_storage,保证足够大以包含地址。使用sockaddr_storage还可以轻松支持IPv4和IPv6,并进行最少的调整。

编辑代码:

struct sockaddr_storage sa;
int sa_len;
sa_len = sizeof(sa);
if (getsockname(socketfd, (struct sockaddr *)&sa, &sa_len) != SOCKET_ERROR)

答案 1 :(得分:1)

而不是一般的 struct sockaddr 使用为协议指定的那个,即* struct sockaddr_in *用于IPv4地址。有关完整示例,请参阅here