我在为无人机编写udp服务器。无人机定期发送有关其传感器数据的数据包。我想知道是否有一个函数或一个优雅的解决方案,可以将最后一个包送到并丢弃前面的包。现在,使用MSG_DONTWAIT标志调用recv()是我唯一能想到的事情,直到出现EAGAIN/EWOULDBLOCK错误。这看起来既慢又浪费。
发布于 2022-06-15 04:12:29
我很确定操作系统没有一个函数来处理所有排队的数据包,但是最后一个包。这不是一个人通常做的事情
你描述的方法是非常好的。也不像你说的那样浪费。
什么可能是浪费是你如何等待一个包裹到达时,没有收到。您应该为此使用select/poll/epoll,而不是使用您描述的循环,只使用一次通知数据包正在等待的循环。
同样浪费的是您在检查新数据包之间所做的工作。当你花费更多的时间处理数据包而不是无人机的推送周期时,你担心的是CPU功率的微秒或纳秒?如果您需要优化,这就是您应该开始的地方。
请注意,您不希望保留recv返回的最后一个数据包,但是具有最新时间戳或序列号的数据包(如果协议提供这些信息)。UDP并不保证按发送的顺序接收数据包。
https://stackoverflow.com/questions/72625522
复制相似问题