WSAE 使用 getsockname 函数时出错

WSAEFAULT error when use getsockname function

本文关键字:出错 函数 getsockname 使用 WSAE      更新时间:2023-10-16

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

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

附言应用程序是64位

谢谢!

您的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)

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