使用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位
谢谢!
答案 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。