我已经使用 Boost C++ 实现了一个 P2P 应用程序。如您所知,UDP不保证数据包顺序甚至数据包传递,所以这是我的想法:
将一个请求的所有接收到的 UDP 数据包放入链接列表中并正确排序,以便可以以稳健的方式识别序列和丢失的数据包。链接列表是使用 struct 制作的。
-或者-
我想把它放在一个向量中,并将向量中的数据包安排在一个单独的线程中。
哪一个是最好的方法?或者除了窗口滑动之外,您还有其他最好的方法吗?
我已经使用 Boost C++ 实现了一个 P2P 应用程序。如您所知,UDP不保证数据包顺序甚至数据包传递,所以这是我的想法:
将一个请求的所有接收到的 UDP 数据包放入链接列表中并正确排序,以便可以以稳健的方式识别序列和丢失的数据包。链接列表是使用 struct 制作的。
-或者-
我想把它放在一个向量中,并将向量中的数据包安排在一个单独的线程中。
哪一个是最好的方法?或者除了窗口滑动之外,您还有其他最好的方法吗?
与其实现自己的容器或排序,不如使用标准库中已有的东西?
例如,您可以使用std::map
序列号作为键。它会自动按键排序。
或者您可以使用std::priority_queue
自己的比较函数来检查序列号。
您还应该查看UPnP NAT 遍历。
为了确保正确的顺序并检测丢失的数据包或重复数据,您必须使用序列号或类似方法。当您将数据包放在发送方的链表中时,如何在接收方检查正确的顺序?有关检测丢失和乱序数据包的示例解决方案,请参阅 TCP 协议(尽管它做得更多)。
通常在可以接受丢包或重新排序时使用 UDP。如果你想确保这两个属性,即使是 UDP,你也必须自己做一些工作。