我已经使用Boost C ++实现了P2P应用程序。如您所知,UDP不能保证数据包的顺序甚至是数据包的传递,所以这就是我的想法:
将所有接收到的UDP数据包放在一个链接列表中,并对其进行正确排序,以便可以以可靠的方式识别序列和丢失的数据包。链接列表是使用struct创建的。
-或-
我想过将其放在向量中,并将向量中的数据包安排在单独的线程中。
哪个是最好的方法?还是除了滑动窗口之外,还有其他最佳方法吗?
而不是实现自己的容器或排序,为什么不使用标准库中已有的内容?
例如,您可以将std::map
与序列号作为键使用。它是按键自动排序的。
或者您可以将std::map
与您自己的用于检查序列号的比较功能一起使用。
您还应该查看std::priority_queue
。
为了确保正确的顺序并检测丢失的数据包或重复项,您必须使用序列号或类似的方法。将数据包放在发送方的链表中时,如何在接收方检查正确的顺序?请参阅TCP协议,以获取有关检测丢失和乱序数据包的示例解决方案的信息(不过,它做得更多)。
通常,当可接受丢包或重新排序时,使用UDP。如果即使对于UDP也要确保这两个属性,则必须自己做一些工作。