2

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

4

2 回答 2

1

以下是我首先想到的。

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

对于发送的每个数据包,保留一个按超时时间升序排序的链接列表。

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

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

一旦选择返回,如果请求可用,则接受()并处理请求。

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

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

于 2012-11-24T23:21:23.920 回答
0

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

于 2012-11-24T23:50:42.380 回答