Linux:是否有超时的套接字读取或接收?
- 2024-10-22 08:29:00
- admin 原创
- 63
问题描述:
我如何尝试在超时的情况下从套接字读取数据?我知道 select、pselect、poll 有一个超时字段,但是使用它们会禁用 tcp reno 堆栈中的“tcp fast-path”。
我唯一的想法是在循环中使用 recv(fd, ..., MSG_DONTWAIT)
解决方案 1:
您可以使用setsockopt函数设置接收操作的超时:
重传时间
设置超时值,该值指定输入函数等待完成的最大时间量。它接受一个 timeval 结构,该结构以秒数和微秒数指定等待输入操作完成的时间限制。如果接收操作阻塞了这么长时间而没有接收到其他数据,则它将返回部分计数或将 errno 设置为 [EAGAIN] 或 [EWOULDBLOCK](如果没有接收到任何数据)。此选项的默认值为零,表示接收操作不会超时。此选项采用 timeval 结构。请注意,并非所有实现都允许设置此选项。
// LINUX
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
// WINDOWS
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
// MAC OS X (identical to Linux)
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
据报道,在 Windows 上,这应该在调用之前完成。我已通过实验验证,在 Linux 和 OS X 上,bind
它可以在之前或之后完成。bind
解决方案 2:
recv
下面是使用C 语言为函数添加超时功能的简单代码poll
:
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;
}
解决方案 3:
// 对于 WINDOWS,绑定操作后也有效
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
解决方案 4:
安装 的处理程序,然后在常规阻塞 之前SIGALRM
使用alarm()
或。如果警报响起,将返回一个设置为 的错误。ualarm()
`recv()recv()
errno`EINTR
解决方案 5:
如果您在嵌入式平台上使用 LWIP,则需要在文件 lwipopts.h 中添加以下行:#define LWIP_SO_RCVTIMEO 1
供参考,请参阅相关问题/答案:
https://stackoverflow.com/a/78903446/13189775
解决方案 6:
Linux
struct timeval tv;
tv.tv_sec = 30; // 30 Secs Timeout
tv.tv_usec = 0; // Not init'ing this can cause strange errors
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv,sizeof(struct timeval));
视窗
DWORD timeout = SOCKET_READ_TIMEOUT_SEC * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));
注意:您已在bind()
函数调用之前设置了此设置,以便正常运行
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件