gpt4 book ai didi

c++ - 是否有 "nice"方法来处理来自多个源的重组多播?

转载 作者:行者123 更新时间:2023-11-28 04:01:21 24 4
gpt4 key购买 nike

我目前正在修改我们现有的专有套接字包装器代码以使用 boost asio,以便它可以为我们完成一些繁重的工作。也许我们现有代码中最复杂的部分是多播处理代码。该代码允许我们的中间层服务器(一个系统中可以有很多)向客户端框发送多播,客户端框使用这些向系统用户呈现更新。

代码复杂且容易出错的原因是它使用大量原始缓冲区根据多播流的来源重新组合多播流。看来即使使用 Boost.Asio,我也将不得不处理同样的问题,所以在我陷入困境之前,我认为有必要问问其他人是如何处理这种情况的。

这似乎是一个非常常见的用例。没有我现在拥有的那种代码,有什么可以帮助我完成这项工作的吗?或者是否有可以完成此类工作的已建立的 C++ 模板(Boost 或其他)?

显然,我可以让事情变得更轻松,并使用 STL 容器来缓冲数据包而不是原始数组,但这段代码需要非常高性能。在大型安装中,有大量数据包飞来飞去,它需要尽可能接近实时地做出响应。

提前感谢您对此事的任何想法。

杰米

最佳答案

听起来您没有提供足够的信息来获得详细的答案,但是对于实时处理多播数据,有一些一般性的建议需要考虑。

  • 如果您使用原始 UDP 多播,您可能正在用户空间中进行某种协议(protocol)排序,以处理丢失或重复的数据包。无论您想做什么优化,抵制住打破应用程序和协议(protocol)层之间分层的诱惑。
  • std::vector,在大多数情况下,与原始动态分配的字符缓冲区相同。不要仅仅因为它是一个抽象层就回避使用它。但是,在两种情况下您应该避免使用它:
    • 如果您可以摆脱静态分配的缓冲区
    • 如果您需要将缓冲区的所有权转移到下游(尽管如果您仔细设计,swap() 可能就足够了)
  • 预分配是你的 friend 。如果您可以在数据传入时使用一组缓冲区,则可以从快速执行路径中删除大部分动态分配。
  • 尽量减少内存复制。如果您可以在单个调用堆栈中处理数据,您就有机会避免复制。如果您必须将数据传递给不同的线程,您可能被迫复制数据。
  • 如果您的应用程序可以处理分块缓冲区(而不是将所有数据聚合到一个缓冲区中),请查看 writevreadv

我不相信任何 jar 装解决方案都能解决您的问题。 Boost ASIO、libevent 等都将为您处理套接字抽象,但是一旦数据被交付,您如何处理数据仍然是您的责任。

关于c++ - 是否有 "nice"方法来处理来自多个源的重组多播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/346650/

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