首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用getsockname函数时的WSAEFAULT错误

使用getsockname函数时的WSAEFAULT错误
EN

Stack Overflow用户
提问于 2013-01-31 11:16:40
回答 2查看 2K关注 0票数 4

我在使用getsockname函数时遇到了问题。我有这样的代码:

代码语言:javascript
运行
复制
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位

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-31 11:26:52

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

编辑代码:

代码语言:javascript
运行
复制
struct sockaddr_storage sa;
int sa_len;
sa_len = sizeof(sa);
if (getsockname(socketfd, (struct sockaddr *)&sa, &sa_len) != SOCKET_ERROR)
票数 4
EN

Stack Overflow用户

发布于 2013-01-31 11:27:18

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14624427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档