WSAE 使用 getsockname 函数时出错
WSAEFAULT error when use getsockname function
我在使用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 地址。有关完整示例,请参阅此处。
相关文章:
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用dynamic_cast和构造函数时出错
- CHECK(调用)函数在Google Colab中出错
- 从R调用C++函数并对其进行集成时出错
- 这个函数哪里出错了
- PrintWindow函数在notepad.exe中出错
- 使用运算符调用 void 函数时出错<set>
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 在定义的函数中使用常量时出错
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 使用根/C++时出错:没有匹配的构造函数来初始化'TTree'
- Arduino IDE 中使用 strncmp 函数时出错
- 从DLL导出函数,LoadLibrary()需要用TEXT转换的字符串才能编译而不会出错
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- 使用一个参数的模板函数时出错(适用于 2)
- 为什么 stl 字符串C++函数有时出错有时会出错?
- 使用类的构造函数时出错
- 在 c++ 的构造函数中分配对象向量时出错
- 为什么在函数参数前面添加 const 会出错?
- 调用析构函数时出错