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

C 您建议在Linux中使用哪种方法读取多播流?,c,linux,multicastsocket,C,Linux,Multicastsocket,我用C/C++在Linux中编写了一个程序,该程序读取多播数据包,并试图尽可能快地理解特定事件是否发生。延迟是这里的关键点 在协议中,前两个字节表示消息类型。 在我当前的实现中,我读取前两个字节,并根据消息类型决定应该为有效负载读取多少字节。也就是说,我对一个数据包执行两次读取操作。一个读取操作用于数据包长度,另一个用于有效负载。因此,有两个I/O操作 或者,我可以这样做,我尽可能多地阅读,检查前2个字节,假设它是N,取N个字节,形成packet1和packet2。如果在读取packet1和pa

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

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

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

理论上哪个更快?我知道我必须实施和衡量这两个方面,但我只是想听听你们的建议


谢谢

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

  • 打开原始数据包套接字(AF_数据包)
  • 实现一个BPF过滤器,它尽可能具体地过滤您需要的数据包
  • 切换到内存映射环缓冲区(数据包MMAP/数据包RX\U环)
  • 直接从内存中读取数据包,而不是使用
    recv()
    。这可以通过使用
    poll()
    完成,或者,通过在内存包元数据上忙着循环来避免
    poll()
    系统调用
  • 直接在环形缓冲区中处理数据包(零拷贝)
  • 将缓冲区标记为“可供重用”
这样,根本不需要系统调用,通过内核的路径很短,延迟应该最小

有关更多信息,请参阅