2008-12-06 43 views
0

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

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

这似乎是一个非常常见的用例。有没有什么可以帮助我完成这项工作,而不需要我现在拥有的代码?还是有一个既定的C++模板(Boost或其他)可以完成这种工作?

很明显,我可以让自己更容易,并使用STL容器来缓冲数据包而不是原始数组,但是此代码需要非常高的性能。在大型安装中,有大量数据包在飞行,并且需要尽可能接近实时地进行响应。

在此先感谢您对此事的任何想法。

杰米

回答

2

它听起来并不像你给予足够的信息,详细的解答,但也有一些普遍的指针要考虑组播数据的实时处理。

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

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

相关问题