请注意:平台是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。
为什么有时超时不起作用?