如何尝试从超时的套接字读取数据?
我知道,select、pselect、poll 有一个超时字段,但是使用它们会禁用 tcp reno 堆栈中的“tcp fast-path”。
我唯一的想法是在循环中使用 recv(fd, ..., MSG_DONTWAIT)
最佳答案
您可以使用 setsockopt 函数设置接收操作的超时时间:
// 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);
Reportedly 在 Windows 上这应该在调用
bind
之前完成。我已经通过实验验证,它可以在 Linux 和 OS X 上的 bind
之前或之后完成。关于c - Linux:是否有超时的套接字读取或接收?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2876024/