请注意:平台是 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。
为什么有时超时不起作用?
答案 0 :(得分:1)
SO_RCVTIMEO
在阻止套接字中不受支持。
如果阻止接收呼叫超时,则说明该连接处于 不确定状态,应将其关闭。如果创建了套接字 使用WSASocket函数,则dwFlags参数必须具有 WSA_FLAG_OVERLAPPED属性设置为功能超时 正确地。否则超时将永远不会生效。
将WSASocket
与WSA_FLAG_OVERLAPPED
一起使用。或socket()
(WSA_FLAG_OVERLAPPED
模式的默认设置)