当套接字设置为处理超时时 select() 会发生什么

What happens to select() when socket is set to handle timeout

根据 recv() 的手册页,如果使用 setsockopt(SO_RCVTIMEO) 设置了接收超时,errno 将设置为 EAGAINEWOULDBLOCK .

我的问题是如果 select() 使用多个这样的套接字会发生什么。如果其中一个套接字由于不活动而超时,将 select return。 select() 会 return 编辑什么。

我正在尝试实现具有检测超时功能的 tftp 服务器。一种方法可能是使用 select() 的超时,但随后我将不得不为每个套接字使用不同的超时值,并不断将计时器更新为最小值,然后再做一些杂耍……等等.. 等等...感觉像是做了很多不必要的工作。

PS:tftp 服务器是一个并发服务器,使用 I/O 多路复用处理多个客户端。

select()的超时参数决定了select()调用本身在调用returns之前等待某事发生的最长时间,而不是个人需要多长时间套接字将在返回超时错误之前等待。

如果您在一段时间内没有收到客户的消息,这听起来像是您想要声明某种错误情况。使用 UDP,您将必须自己跟踪它。对于每个客户,请记录您最后一次收到他们的消息。将 select() 放入一个超时时间约为 1 秒的循环中,然后每次 returns 检查当前时间与您上次从每个客户端收到的时间之间的差异。当该差异超过您想要的任何阈值时,您就会遇到错误情况。