如何尝试从带超时的套接字中读取数据?我知道,select、pselect、poll都有一个超时字段,但是使用它们会禁用tcp reno堆栈中的"tcp fast-path“。
我唯一的想法是在循环中使用recv(fd,...,MSG_DONTWAIT
发布于 2015-09-30 01:14:41
下面是在C中使用poll
向recv
函数添加超时的一些简单代码:
struct pollfd fd;
int ret;
fd.fd = mySocket; // your socket handler
fd.events = POLLIN;
ret = poll(&fd, 1, 1000); // 1 second for timeout
switch (ret) {
case -1:
// Error
break;
case 0:
// Timeout
break;
default:
recv(mySocket,buf,sizeof(buf), 0); // get your data
break;
}
发布于 2010-05-21 09:11:52
安装SIGALRM
处理程序,然后在常规阻塞recv()
之前使用alarm()
或ualarm()
。如果警报响起,recv()
将返回一个错误,并将errno
设置为EINTR
。
发布于 2018-04-04 14:08:05
//在WINDOWS的绑定操作之后也可以工作
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
https://stackoverflow.com/questions/2876024
复制相似问题