繁体   English   中英

您建议使用哪种方法在 Linux 中读取多播流?

[英]Which method do you suggest for reading multicast stream in Linux?

我使用 C/C++ 在 Linux 中编写了一个程序,该程序读取多播数据包并尝试尽快了解特定事件是否发生。 延迟是这里的关键点。

在协议中,前两个字节代表消息类型。 在我当前的实现中,我读取前两个字节并根据消息类型决定我应该为有效负载读取多少字节。 即,我对 1 个数据包执行 2 次读取操作。 读取操作之一是针对数据包长度,另一个是针对有效载荷。 因此,有 2 个 I/O 操作。

或者,我可以这样做,我尽可能多地阅读,检查前 2 个字节,假设它是 N,查找 N 个字节并形成 packet1 和 packet2。 如果在读取 packet1 和 packet2 后还有剩余字节,则读取更多字节并再次按上述方法处理字节缓冲区。 在这种方法中,我做了 1 个 I/O,但需要在字节缓冲区中遍历。

理论上哪个更快? 我知道我必须实施和衡量两者,但我只是想听听您的建议。

谢谢

我所知道的最快的方法是:

  • 打开原始数据包套接字 (AF_PACKET)
  • 实现 BPF 过滤器,尽可能具体地过滤您需要的数据包
  • 切换到内存映射环形缓冲区(PACKET_MMAP/PACKET_RX_RING)
  • 直接从内存中读取数据包,而不是使用recv() 这可以使用poll()来完成,或者,通过忙循环内存数据包元数据来避免poll()系统调用。
  • 直接在环形缓冲区中处理数据包(零拷贝)
  • 将缓冲区标记为“可重用”

这样,根本不需要系统调用,通过内核的路径很短,延迟应该最小。

有关更多信息,请参阅数据包 mmap 内核文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM