为什么在 SO_RCVTIMEO 套接字超时时不轮询唤醒?
Why doesn't poll wakeup when socket timed out with SO_RCVTIMEO?
我正在编写一个最多可同时处理 10 个连接的回显 TCP 服务器。它有一个空闲超时(当没有新连接或没有来自套接字的新数据时)和一个套接字超时(当客户端在 xx 时间内没有发送任何新内容时)。
我在 poll() 中处理了带有超时参数的第一部分。对于第二部分,对于每个新连接,我使用以下选项设置套接字:
setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &socketTimeout, sizeof(struct timeval)
我希望当套接字超时时,它会唤醒 poll(),当我调用 read() 之后它只会 return -1,我可以做我的事情了。但似乎并非如此。 SO_RCVTIMEO 似乎对 poll() 没有影响,我错过了什么?
对link你在评论中提到的文章会有帮助
同时,引用 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.
因此,要发生超时,必须调用 read
。 poll
仅监控数据可用性。
我正在编写一个最多可同时处理 10 个连接的回显 TCP 服务器。它有一个空闲超时(当没有新连接或没有来自套接字的新数据时)和一个套接字超时(当客户端在 xx 时间内没有发送任何新内容时)。
我在 poll() 中处理了带有超时参数的第一部分。对于第二部分,对于每个新连接,我使用以下选项设置套接字:
setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &socketTimeout, sizeof(struct timeval)
我希望当套接字超时时,它会唤醒 poll(),当我调用 read() 之后它只会 return -1,我可以做我的事情了。但似乎并非如此。 SO_RCVTIMEO 似乎对 poll() 没有影响,我错过了什么?
对link你在评论中提到的文章会有帮助
同时,引用 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.
因此,要发生超时,必须调用 read
。 poll
仅监控数据可用性。