如何尝试从套接字读取超时数据?
我知道,select、pselect、poll 有一个超时字段,但是使用它们会禁用 tcp reno 堆栈中的“tcp 快速路径”。
我唯一的想法是在循环中使用 recv(fd, ..., MSG_DONTWAIT)
您可以使用套索克选择设置接收操作超时的函数:
SO_RCVTIMEO
设置指定的超时值
输入的最长时间
函数等待直到完成。它
接受 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 上,这应该在调用之前完成bind
。我已经通过实验验证了它可以在之前或之后完成bind
在 Linux 和 OS X 上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)