【发布时间】:2019-09-02 11:19:15
【问题描述】:
根据recv() 的手册页,如果使用setsockopt(SO_RCVTIMEO) 为接收设置了超时,则errno 设置为EAGAIN 或EWOULDBLOCK。
我的问题是如果多个这样的套接字与select() 一起使用会发生什么。如果其中一个套接字由于不活动而超时,将选择返回。 select() 将返回什么。
我正在尝试实现一个具有超时检测功能的 tftp 服务器。一种方法是使用select() 的超时,但是我必须为每个套接字使用不同的超时值,并不断将计时器更新为最小值,然后再做一些杂耍......等等。等等......感觉就像很多不必要的工作。
PS:tftp 服务器是一个并发服务器,使用 I/O 多路复用处理多个客户端。
【问题讨论】:
-
改为使套接字非阻塞。
-
并使用警报实现超时??还有什么办法?
-
不,你会使用 select 超时。
-
不,使用警报是个坏主意。这就是为什么我建议选择超时。您需要为每个套接字缓冲数据,以便为每个套接字设置一个 结构。
-
将结构体或指向它们的指针保存在队列中。具有最近超时的结构将始终位于头部,因此头部超时。在尾部添加新的超时。