【问题标题】:SO_RCVTIMEO socket option doesn't work with recvfrom()SO_RCVTIMEO 套接字选项不适用于 recvfrom()
【发布时间】:2012-09-23 12:52:34
【问题描述】:

我设置了套接字选项 SO_RCVTIMEO 但它真的不适用于 UDP recvfrom() 系统调用?有人可以帮帮我吗?

【问题讨论】:

  • 您可以粘贴您的代码,以便我们查找错误。一般应该没有问题

标签: c network-programming


【解决方案1】:

可能是您给出的超时太小,它返回 -1,EAGAIN 作为 errno。

【讨论】:

    【解决方案2】:

    可能的错误可能是误用了 select() 函数。 不要忘记检查其结果是否为零。

    代码应该是这样的:

    int nRes = 0;
    
    fd_set socketset;
    memset(&socketset, 0, sizeof(socketset));
    socketset.fd_count = 1;
    socketset.fd_array[0] = sock;
    timeval timeout = {0, 0};
    timeout.tv_sec = dwTimeout / 1000;
    timeout.tv_usec = (dwTimeout % 1000) * 1000;    // microseconds
    
    nRes = select(0, &socketset, NULL, NULL, &timeout);
    if (nRes == SOCKET_ERROR)
    {
        return WSAGetLastError();
    }
    if (nRes == 0)  // timeout
    {
        return WSAETIMEDOUT;
    }
    
    int nDestLen = sizeof(dest);
    nRes = recvfrom (sock, (char*) &buf[0], buf.size(), 0,
        (sockaddr*) &dest, &nDestLen);
    

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 2012-04-08
      • 1970-01-01
      • 2014-04-02
      • 2021-10-04
      • 2013-05-22
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多