c - 为什么套接字超时时不通过 SO_RCVTIMEO 轮询唤醒?

标签 c network-programming

我正在编写一个最多可同时处理 10 个连接的回显 TCP 服务器。它有一个空闲超时(当没有新连接或没有来自套接字的新数据时)和一个套接字超时(当客户端在 xx 时间内没有发送任何新数据时)。

我在 poll() 中用超时参数处理了第一部分。对于第二部分,对于每个新连接,我使用以下选项设置套接字:

setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &socketTimeout, sizeof(struct timeval)

我希望当套接字超时时,它会唤醒 poll(),当我调用 read() 后它只会返回 -1,我可以做我的事情了。但似乎并非如此。 SO_RCVTIMEO 似乎对 poll() 没有影响,我错过了什么?

最佳答案

如果链接到您在评论中提到的文章会很有帮助。

同时,引用man 7 socket

Timeouts only have effect for system calls that perform socket I/O (e.g., read(2), recvmsg(2), send(2), sendmsg(2)); timeouts have no effect for select(2), poll(2), epoll_wait(2), and so on.

因此,要发生超时,必须调用 readpoll 仅监控数据可用性。

关于c - 为什么套接字超时时不通过 SO_RCVTIMEO 轮询唤醒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53796022/

相关文章:

c - C代码中令人惊讶的段错误

c - 有什么办法可以让这段代码变得更简单吗?

c++ - 减去两个 IPv6 地址得到错误的值

java - NIC 吞吐量样本

c - 在 while(1) 循环中阻塞的线程内处理 postthreadmessage() 或使用 "Event Driven Sockets"

c - Linux 内核标识符中前导和尾随下划线的含义是什么?

c++ - 生成唯一编号

c - 如何在多线程程序中防止SIGPIPE?

c - 结构中的 "s"是什么意思?

c - 输入值以在 c 中堆叠 2 维