是否有一种“好”的方式来处理从多个来源重组多播?

时间:2008-12-06 19:31:31

标签: c++ boost boost-asio multicast

我正在重新使用现有的专有套接字包装代码来使用boost asio,以便它可以为我们做一些繁重的工作。也许我们现有代码中最复杂的区域是多播处理代码。该代码允许我们的中间层服务器(在一个系统中可以有多个)将多播发送到客户端盒,客户端盒用于向系统用户提供更新。

代码复杂且容易出错的原因是它使用了许多原始缓冲区来根据它们的来源重新组合多播流。似乎即使使用Boost.Asio,我也不得不处理同样的问题,所以在我陷入困境之前,我认为值得问别人如何应对这种情况。

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

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

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

杰米

1 个答案:

答案 0 :(得分:2)

听起来您没有提供足够的详细答案信息,但有一些通用指针需要考虑实时处理组播数据。

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

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