我正在编写一个 UDP 服务器作为应用程序的一部分。在以下代码段中:
int ServerManager::onListen(void * data)
{
int numbytes;
char buf[512];
socklen_t addrlen = sizeof(sockaddr_in);
struct sockaddr_in addr;
if((numbytes = recvfrom(listenSocket,buf, sizeof(buf),0,(SOCKADDR*) &addr, &addrlen)
== -1))
{
std::cout << "recv error:" << WSAGetLastError();
return -1;
}
std::cout << "done";
return 0;
}
我收到错误代码 10014“WSAEFAULT”,并且从未到达“完成”。我使用 C++ 和 winsock2。如果我用 NULL 替换最后两个参数,则 recvfrom() 调用工作正常。从我在其他地方看到的这个问题来看,我希望正确设置 addrlen 和缓冲区来解决这个问题,但是代码像现在这样简单,我很难找到它失败的原因。我觉得这一定是我忽略的简单事情,我们将不胜感激。
最佳答案
错误是由套接字的设置引起的。 将 ai_family 从“AF_UNSPEC”更改为“AF_INET”解决了这种情况下的问题,但为了保持 ipv6 兼容性,代码修改如下。
int ServerManager::onListen(void * data)
{
int numbytes;
char buf[MAXBUFLEN];
SOCKADDR_STORAGE addr;
socklen_t addrlen = sizeof(addr);
if((numbytes = recvfrom(listenSocket,buf, sizeof(buf),0,(LPSOCKADDR) &addr, &addrlen)
== -1))
{
std::cout << "recv error:" << WSAGetLastError();
return -1;
}
std::cout << "done";
return 0;
}
关于c++ - 在 Windows 的 C++ 中使用 recvfrom() 时出现 WSAEFAULT 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35283130/