4

我在使用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 描述:

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

ps 应用程序是 64 位的

谢谢!

4

2 回答 2

4

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

编辑代码:

struct sockaddr_storage sa;
int sa_len;
sa_len = sizeof(sa);
if (getsockname(socketfd, (struct sockaddr *)&sa, &sa_len) != SOCKET_ERROR)
于 2013-01-31T11:26:52.027 回答
1

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

于 2013-01-31T11:27:18.337 回答