c - 处理多个 UDP 流

标签 c sockets networking linux-kernel udp

假设我有 m UDP 流,由一些 id 唯一标识(例如 RTP SSRC)。我需要在 n 关联线程中处理它们并且关联是 1-N,即一个 UDP 流由一个或多个线程处理。

如果我:

  1. 启动 m 个 UDP 服务器,每个服务器在不同的端口上。每个服务器处理一个流并将其数据推送到一个或多个关联线程。

  2. 只启动一台服务器。所有流都由它的单个端口处理,并且该线程将每个流数据推送到一个或多个关联线程旁边。

我认为这归结为一个问题:打开一个端口好还是打开多个端口好,每个端口接收的数据按比例减少?

单个套接字是否有可能被传入数据量淹没?或者,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/

相关文章:

c - 在链表 C 中添加和查找节点

c - CMSG_ALIGN 宏的值是多少

java - 如何停止程序在关闭 GUI 时运行无限循环

java - 实现 "X bytes downloaded from Y"

c# - 如何获取WLAN IP地址?

c++ - ERROR_IO_PENDING 后的多个 WriteFile

c - 多个可执行文件上的 libcurl 和curl_global_init()

java - Java上的Socket连接,指定IP

c++ - 在 Windows 中,如何使用 C++ 检查端口是否可用

security - 是否应该始终依赖错误检测机制?