假设我有 m
UDP 流,由一些 id 唯一标识(例如 RTP SSRC)。我需要在 n
关联线程中处理它们并且关联是 1-N
,即一个 UDP 流由一个或多个线程处理。
如果我:
启动
m
个 UDP 服务器,每个服务器在不同的端口上。每个服务器处理一个流并将其数据推送到一个或多个关联线程。只启动一台服务器。所有流都由它的单个端口处理,并且该线程将每个流数据推送到一个或多个关联线程旁边。
我认为这归结为一个问题:打开一个端口好还是打开多个端口好,每个端口接收的数据按比例减少?
单个套接字是否有可能被传入数据量淹没?或者,socket 在 linux 内核中更像是逻辑事物而不是物理事物,与数据本身没有太多关系,所以没有真正的区别?
单个 UDP 套接字(具有扩大的缓冲区)可以处理的最大比特率是多少?
我相信我最好通过浏览内核的网络代码找到答案,但也许有人可以直接给出答案。谢谢。
最佳答案
要回答这个问题并不容易,因为这全都归结为线程的处理速度以及您如何在线程之间委派工作。
如果您认为 udp 套接字将不堪重负,您可以在 udp 套接字后面创建一个队列。这个队列可以增长到你允许它增长的大小。当然你会使用更多的内存。
您将拥有一个消费者/生产者范例。一个线程将东西放入队列,其他线程从队列中取东西。
如果线程的处理速度比填充队列的线程慢,并且这种情况会持续很长时间。您的队列无论如何都会超限。
有专用于多媒体处理任务的框架。您可能想看看 gstreamer。 http://gstreamer.freedesktop.org/documentation/
它支持 RTP,基本上是一个允许创建数据流管道的系统,这正是您在这里所做的。
您会发现 gstreamer 已经准备好队列,允许在管道中的某处排队一些数据。无论如何,这向我证明了在高速处理时需要这样的东西。虽然我不是 gstreamer 专家。 Gstreamer 具有构建 block ,因此您可以试验管道并轻松添加队列、删除队列并比较整个管道的结果。它确实需要一些学习来了解 api。它是用 C 语言编写的。
关于c - 处理多个 UDP 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31561350/