我在使用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参数太小。
附注:应用程序为64位
谢谢!
发布于 2013-01-31 11:26:52
您的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)发布于 2013-01-31 11:27:18
不要使用一般的sockaddr,而要使用为您的协议指定的一个,即*struct sockaddr_in*用于IPv4地址。有关完整的示例,请参见这里。
https://stackoverflow.com/questions/14624427
复制相似问题