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

时间:2019-04-11 18:24:36

标签: tcp udp ip tftp

根据num的手册页,如果已设置recv()的接收超时,则errno设置为EAGAINEWOULDBLOCK

我的问题是,如果setsockopt(SO_RCVTIMEO)与多个这样的套接字一起使用,会发生什么情况。如果套接字之一由于不活动而超时,则将选择return。 select()将返回什么。

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

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

1 个答案:

答案 0 :(得分:1)

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

听起来好像您要声明某种错误条件(如果一段时间未收到客户的来信)。使用UDP,您将必须自己进行跟踪。对于每个客户,请记录您上次收到的消息。将select()放入一个超时时间约为1秒的循环中,然后每次返回时,请检查当前时间与您从每个客户端收到的上次时间之间的时差。当该差异超过所需的阈值时,就会出现错误情况。