c++ - 在 Windows 的 C++ 中使用 recvfrom() 时出现 WSAEFAULT 错误

标签 c++ udp codeblocks winsock2

我正在编写一个 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/

相关文章:

c++ - 无法使教程中的 wxWidgets 示例正常工作

c++ - 错误 : No matching function for call to class object

c++ - 类型 "const char **"的参数与类型 "const char *"的参数不兼容

c++ - asio 和 "streaming server"

c# - 在C#中连接到Udp服务器的客户端列表

delphi - 使用 SO_REUSEADDR 时接收发送到 127.0.0.1 的 UDP 数据包

c - 使用 gcc,我无法获取第 3 方库 Cairo 来链接/编译

c++ - C++11 std::sort 在不同的 STL 实现中使用了哪些算法?

c++ - 在析构函数中删除指针和映射

C++ 部分特化不适用于不同大小的特征矩阵