繁体   English   中英

如何在C中为多个UDP数据包设置超时?

[英]How to setup timeout for multiple UDP packets in C?

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

以下是我首先想到的。

打开套接字以非阻塞模式侦听。 不阻塞是关键。 如果select表示有东西存在,但事件恰好对准,则可能是在其他地方处理的错误警报,并且阻塞了不来的东西很麻烦。

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

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

使用select等待下一个传入的数据包,并在合理的时间内超时。 我倾向于最多使用几秒钟,即使看起来更长的超时时间可以弥补任何罕见的“以防万一”情况也是合理的。 您在此处阻止的是传入数据包,但不要超过下次超时。

选择返回后,如果请求可用,则accept()并处理请求。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM