windows下socket的recvfrom阻塞的奇怪问题

16 阅读1分钟

此处只做记录,不做分析。

    // 代码1
    int timeout = 5000;
    if(setsockopt(m_responseSocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)) < 0){
        std::cerr << "setsockopt failed" << std::endl;
        closesocket(m_responseSocket);
        return;
    }

    // 代码2
     struct timeval timeout;
     timeout.tv_sec = 5;
     timeout.tv_usec = 0;
    if(setsockopt(m_responseSocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)) < 0){
        std::cerr << "setsockopt failed" << std::endl;
        closesocket(m_responseSocket);
        return;
    }

同样的recvfrom.

      int bytesReceived = ::recvfrom(m_responseSocket, buffer.data(), sizeof(buffer), 0, (sockaddr*)&fromAddr, &fromAddrLen);
        if(bytesReceived < 0){
            std::cerr << "recvfrom failed: " << WSAGetLastError() << std::endl;
            continue;
        }

但是 代码1 是正常的,每隔5s重新continue。

代码2 只有首次是等待5s,之后不会再阻塞,会直接返回。

错误码都是 10060。