gpt4 book ai didi

c - 如何使 UDP 套接字在新消息到达时替换旧消息(尚未接收())?

转载 作者:太空狗 更新时间:2023-10-29 17:18:09 24 4
gpt4 key购买 nike

首先,一些上下文来解释为什么我在“UDP 采样”路线上:
我想对未知时间段内快速生成的数据进行采样。我要采样的数据在另一台机器上,而不是在使用数据的机器上。我在两者之间有专用的以太网连接,因此带宽不是问题。我遇到的问题是消耗数据的机器比生成数据的机器慢得多。一个额外的约束是,虽然我没有得到所有样本(它们只是样本)也没关系,但我必须得到最后一个

我的第一个解决方案是让数据生产者为每个生产的样本发送一个 UDP 数据报,让数据消费者尝试获取它可以获取的样本,并让其他样本在 UDP 套接字已满时被套接字层丢弃。此解决方案的问题在于,当新的 UDP 数据报到达且套接字已满时,丢弃的是数据报,而不是旧数据报。因此,我不能保证拥有最后一个!

我的问题是:有没有办法让 UDP 套接字在新数据报到达时替换旧数据报?

接收器目前是一台 Linux 机器,但将来可能会改变为支持另一个类 unix 操作系统(windows 可能是可能的,因为它实现了 BSD 套接字,但不太可能)
理想的解决方案是使用广泛的机制(如 setsockopt()s)来工作。

PS:我想到了其他解决方案,但它们更复杂(涉及对发件人进行大量修改),因此我想首先对我提出的问题的可行性有一个明确的状态! :)

更新:- 我知道接收机器上的操作系统可以处理网络负载+发送方生成的流量的重组。只是它的默认行为是在套接字缓冲区已满时丢弃新的数据报。而且由于接收过程中的处理时间,我知道无论我做什么它都会变满(在套接字缓冲区上浪费一半的内存不是一个选项:))。
- 我真的很想避免让辅助进程执行操作系统在数据包调度时可以完成的操作,并避免在 SHM 中复制消息而浪费资源。
- 我在修改发件人时看到的问题是我有权访问的代码只是一个 PleaseSendThisData() 函数,它不知道它可能是很久以前最后一次被调用,所以我不在那一端看到任何可行的技巧......但我愿意接受建议! :)

如果真的没有办法改变 BSD 套接字中的 UDP 接收行为,那么好吧......告诉我,我准备接受这个可怕的事实,并且当我开始研究“辅助进程”解决方案时回去吧:)

最佳答案

只需将套接字设置为非阻塞,并在 recv() 上循环,直到它返回 < 0 和 errno == EAGAIN。然后处理您收到的最后一个数据包,冲洗并重复。

关于c - 如何使 UDP 套接字在新消息到达时替换旧消息(尚未接收())?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3458385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com