如何尝试从超时的套接字读取数据?
我知道,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/

10-13 07:03