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