【问题标题】:How to setup timeout for multiple UDP packets in C?如何在C中为多个UDP数据包设置超时?
【发布时间】:2012-11-24 22:45:34
【问题描述】:

我正在编写一个 UDP 服务器/客户端程序,其中服务器通过具有固定窗口大小的单个端口向客户端发送数据包,并且客户端将为收到的每个数据包发送回 ack 数据包。现在我希望服务器处理丢失数据包的情况。通过一些谷歌搜索,似乎我应该使用ALARM 或SELECT。我当然不想发送一个数据包,等待ack或超时,然后再发送另一个,但是SELECT会在超时期间阻塞调用函数,所以我认为这不好。 ALARM 也不好,因为一个程序只能有一个ALARM。那么有什么方法可以让我继续跟踪服务器发送的多个数据包的超时时间吗?

【问题讨论】:

  • 既然担心丢包,为什么不使用TCP呢?我的理解是 UDP 最适合“一劳永逸”的情况,即可以接受一些丢包和排序不重要的情况。如果丢失任何数据包是不可接受的并且必须“按顺序”接收数据包,TCP 会处理跟踪、确认、重试和数据包排序。

标签: c udp timeout alarm select-function


【解决方案1】:

以下是我首先想到的。

打开套接字以在非阻塞模式下监听。非阻塞是关键。如果 select 说有些东西在那里,但事件恰好对齐,这可能是在其他地方处理的误报,并且阻止不来的东西是麻烦的。

为每个发送的数据包保留一个按超时时间升序排序的链表。

收到响应后,从链表中删除。

使用 select 等待下一个传入的数据包并具有合理的超时时间。我倾向于使用最多几秒钟,即使看起来更长的超时时间是合理的,以涵盖任何罕见的“以防万一”情况。您在这里阻止的是传入的数据包,但不会超过下一次超时。

一旦 select 返回,如果请求可用,则 accept() 并处理请求。

在迭代循环处理任何新的超时之前,适当调整链表。

快速网络搜索在http://www.lowtek.com/sockets/select.html 发现了更多详细信息。

【讨论】:

    【解决方案2】:

    select() 将以相同的方式阻止 recvmsg() 阻止。它是超时的替代品。您还可以使用 SO_RCVTIMEO 选项来设置读取超时,如果您的平台支持,这会更简单。

    【讨论】:

      猜你喜欢
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2020-07-12
      • 2011-06-12
      • 1970-01-01
      • 2016-03-24
      • 2011-12-06
      相关资源
      最近更新 更多