SO_RCVTIMEO使套接字超时时,为什么不轮询唤醒?

时间:2018-12-15 18:24:53

标签: c network-programming

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

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

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

我希望当套接字超时时,它将唤醒poll(),而当我调用read()之后它仅返回-1时,我就可以做我的事情。但事实并非如此。 SO_RCVTIMEO似乎对poll()无效,我想念什么?

1 个答案:

答案 0 :(得分:2)

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

同时,引用man 7 socket

  

超时仅对执行套接字I / O的系统调用有效(例如read(2),recvmsg(2),send(2),sendmsg(2));超时对select(2),poll(2),epoll_wait(2)等无效。

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