0

请注意:平台是Windows,而不是 Linux。

我有一个阻塞的 TCP 客户端套接字。连接远程服务器后,我设置了一个读取超时(因为远程服务器不稳定,网络条件不好),然后接收数据。

有时,recv()函数永远不会返回,我的程序已经死了。

代码如下所示:

// set timeout
{
    int millisec = 1000;
    if(setsockopt(sock_, SOL_SOCKET, SO_RCVTIMEO, (char*)&millisec, sizeof(int))) {
        MessageBox(0, "setsockopt fail", "", 0);
    }
}

unsigned begin_t = time(0);
int r = recv(sock_, ptr, static_cast<int>(size), 0);
unsigned end_t = time(0);

if(end_t - begin_t > 2) {
    MessageBox(0, "over 2 sec", "", 0); // This MessageBox popups some time
}

我在recv()函数之前将套接字超时设置为 1 秒。理论上,这个recv()过程永远不会超过 1 秒。但有时,它仍然需要超过 3 秒,然后出现 MessageBox。

为什么有时超时不起作用?

4

1 回答 1

1

SO_RCVTIMEO阻塞套接字不支持。

如果阻塞接收调用超时,则连接处于不确定状态并应关闭。如果套接字是使用 WSASocket 函数创建的,则 dwFlags 参数必须设置 WSA_FLAG_OVERLAPPED 属性才能使超时正常工作。否则超时永远不会生效。

使用WSASocketwith WSA_FLAG_OVERLAPPED。或socket()WSA_FLAG_OVERLAPPED模式的默认值)

于 2019-05-16T02:44:28.010 回答