C

时间:2016-02-28 09:25:37

标签: c networking network-programming udp timeout

我需要读取/写入数据的一堆UDP套接字。我使用select循环套接字来确定读/写就绪状态。因此,除非套接字准备就绪,否则我从不对它们使用recvfromsendto,因为我不希望我的程序被阻止。

我的问题是,我需要在套接字上实现超时,如果我还有一段时间无法读取它。

到目前为止,我已经看到了很多建议,例如:

  1. select上设置超时:但是,如果n-1套接字始终就绪,但n套接字永远不会收到数据,那么这不会起作用; select永远不会超时。我希望特别为n套接字暂停。
  2. 使用setsockopt:但是,这要求我阻止recvfrom来电,我无法负担,因为如果他们准备就绪我必须关注其他插座。
  3. 如果套接字已准备好recvfrom一段时间,我需要一种方法让我的程序发出超时信号。请注意,我无法阻止,也无法使用线程或分叉。

    有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果使用select(),则必须跟踪套接字上次可读的时间,并处理每个套接字不可读的套接字集。 select()循环,与其上次可读时间进行比较。只是一个简单的数据结构问题。

答案 1 :(得分:-1)

对于UDP,您应该知道socket_fd将始终可写(实际上udp没有发送缓冲区所以我这样说。平台:Linux)。因此,如果您在select()上设置超时,您几乎总会得到可写的select返回套接字。您可以检查它是否可写或可读。

一个简单的方法是当你找到select返回套接字时,先检查是否有可读的套接字。如果没有并且您没有任何日期要发送,请暂停一会儿然后再循环。