是有一个"好"的方式来处理重新组合多播从多个来源是什么?
-
19-08-2019 - |
题
目前,我正在改造我们的现有专有插座的包装码的使用提高asio,以便它可以做一些繁重。也许最复杂的领域内我们的现有码播处理代码。代码允许我们的中级服务器(其中也有可能我很多在一个系统的)发组播的方式向客户的箱子,它使用这些本更新用户的系统。
因代码复杂,容易出错的是,它使用一定数量的原始缓冲区重新组合多播流中根据他们来自何方。它的出现,甚至提升。Asio我要处理与此相同问题,所以我才会停留在我认为这将是值得一问的其他人如何处理这种情况。
这似乎是一个很常见的使用情况。有什么可以帮我做这个工作没有这样的代码,我们现在?或是有一个建立C++的样板(提高或以其他方式),可以做这样的工作?
很明显我可以让事情变得更容易对自己和使用STL容器缓冲区的分组,而不是原阵列,但这种代码需要很高的性能。在大会安装有一个巨大的分组数周围的飞行并需要作出反应,近实时作为可能。
预先感谢任何的想法在这个问题。
杰米
解决方案
它不喜欢你的声音已经给予足够的信息的详细答案,但有一些一般性的指针,以考虑适用于实时处理的多播数据。
- 如果你使用原播UDP,你可能做某种形式的协议,排序在用户,以便处理丢失或重复的数据包。任何优化你想做的事, 抵抗的诱惑 打破层之间的应用程序和协议层。
std::vector
, ,对于大多数的目的,是完全相同的一个原动态分配角色的缓冲区。不要回避使用它,只是因为它是一个抽象层。在两种情况下你应该避免,但是:- 如果你可以得到静态的分配的缓冲区
- 如果你需要的所有权转让缓冲下(虽然如果设计门洞,
swap()
可能是足够的)
- 预分配是你的朋友。如果你可以有一定的缓冲区可供使用时数据,可以删除最有活力的分配,从快速路径的执行。
- 尽量减少存储器的副本。如果你可以处理的数据在一个单一的呼叠,你有一个机会,以避免的副本。如果你有数据传递了一个不同的线,你可能会被迫以复制的数据。
- 如果应用程序可处理分缓(而不是汇集所有数据并入一个单一的缓冲区),看到
writev
和readv
.
我不相信任何罐头的解决方案将会解决你的问题。提高ASIO, libevent
, 等等。将所有处理座抽象你,但你做什么你的数据仍然是你的责任,一旦它已经交付。
不隶属于 StackOverflow