超时阻止TCP套接字不起作用

时间:2019-05-15 08:06:04

标签: sockets winapi socket-timeout-exception winsockets

请注意:平台是 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。

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

1 个答案:

答案 0 :(得分:1)

SO_RCVTIMEO在阻止套接字中不受支持。

  

如果阻止接收呼叫超时,则说明该连接处于   不确定状态,应将其关闭。如果创建了套接字   使用WSASocket函数,则dwFlags参数必须具有   WSA_FLAG_OVERLAPPED属性设置为功能超时   正确地。否则超时将永远不会生效。

WSASocketWSA_FLAG_OVERLAPPED一起使用。或socket()WSA_FLAG_OVERLAPPED模式的默认设置)