根据recv()
的手册页,如果使用errno
设置了接收超时,则EAGAIN
设置为EWOULDBLOCK
或setsockopt(SO_RCVTIMEO)
。
我的问题是如果多个这样的套接字与select()
一起使用会发生什么。如果其中一个套接字由于不活动而超时,则会选择返回。什么将由select()
返回。
我正在尝试实现一个具有检测超时功能的tftp服务器。一种方法可能是使用select()
超时,但后来我必须为每个套接字使用不同的超时值,并继续更新计时器到最小值,然后做一些更多的杂耍......等等。等等。 ..感觉就像很多不必要的工作。
PS:tftp服务器是一个并发服务器,使用I / O Multiplexing处理多个客户端。
select()的timeout参数确定select()调用本身在调用返回之前等待某事发生的最长时间,而不是单个套接字在返回超时错误之前等待多长时间。
如果您在一段时间内没有收到客户的回复,这听起来像是想要声明某种错误情况。使用UDP,您必须自己跟踪。对于每个客户,记录上次您收到的消息。将select()放入一个超时为1秒的循环中,然后每次返回时检查当前时间与上次从每个客户端听到的时间之间的差异。当差异超过您想要的任何阈值时,您就会出现错误情况。