我正在编写一个 UDP 服务器/客户端程序,其中服务器通过具有固定窗口大小的单个端口向客户端发送数据包,客户端将为收到的每个数据包发回 ack 数据包。现在我想让服务器处理丢包的情况。通过谷歌搜索,我似乎应该使用 ALARM
或 SELECT
。我当然不想发送一个数据包,等待ack或超时,然后发送另一个,但是SELECT
会在超时期间阻塞调用函数,所以我认为这样不好。 ALARM
也不好,因为一个程序只能有一个ALARM
。那么有什么方法可以让我继续跟踪服务器发送的多个数据包的超时时间吗?
最佳答案
下面是我首先想到的。
以非阻塞模式打开套接字进行监听。非阻塞是关键。如果 select 说那里有东西,但事件对齐恰到好处,它可能是在其他地方处理的错误警报,并且阻止不会出现的东西是麻烦的。
对于发送的每个数据包,保留一个按超时时间升序排序的链表。
收到响应后从链接列表中删除。
使用 select 在合理的超时时间内等待下一个传入数据包。我倾向于使用最多几秒钟,即使看起来更长的超时时间对于涵盖任何罕见的“以防万一”情况来说是合理的。您在这里阻止的是传入数据包,但不会超过下一次超时。
一旦选择返回,如果请求可用则接受()并处理请求。
在迭代循环处理任何新超时之前,适当调整链表。
通过快速网络搜索可以在 http://www.lowtek.com/sockets/select.html 找到更多详细信息.
关于c - 如何在 C 中为多个 UDP 数据包设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13546423/