我需要读取/写入数据的一堆UDP套接字。我使用select
循环套接字来确定读/写就绪状态。因此,除非套接字准备就绪,否则我从不对它们使用recvfrom
或sendto
,因为我不希望我的程序被阻止。
我的问题是,我需要在套接字上实现超时,如果我还有一段时间无法读取它。
到目前为止,我已经看到了很多建议,例如:
select
上设置超时:但是,如果n-1
套接字始终就绪,但n
套接字永远不会收到数据,那么这不会起作用; select
永远不会超时。我希望特别为n
套接字暂停。setsockopt
:但是,这要求我阻止recvfrom
来电,我无法负担,因为如果他们准备就绪我必须关注其他插座。如果套接字已准备好recvfrom
一段时间,我需要一种方法让我的程序发出超时信号。请注意,我无法阻止,也无法使用线程或分叉。
有什么建议吗?
答案 0 :(得分:1)
如果使用select()
,则必须跟踪套接字上次可读的时间,并处理每个套接字不可读的套接字集。 select()
循环,与其上次可读时间进行比较。只是一个简单的数据结构问题。
答案 1 :(得分:-1)
对于UDP,您应该知道socket_fd将始终可写(实际上udp没有发送缓冲区所以我这样说。平台:Linux)。因此,如果您在select()
上设置超时,您几乎总会得到可写的select
返回套接字。您可以检查它是否可写或可读。
一个简单的方法是当你找到select返回套接字时,先检查是否有可读的套接字。如果没有并且您没有任何日期要发送,请暂停一会儿然后再循环。