C 您建议在Linux中使用哪种方法读取多播流?
我用C/C++在Linux中编写了一个程序,该程序读取多播数据包,并试图尽可能快地理解特定事件是否发生。延迟是这里的关键点 在协议中,前两个字节表示消息类型。 在我当前的实现中,我读取前两个字节,并根据消息类型决定应该为有效负载读取多少字节。也就是说,我对一个数据包执行两次读取操作。一个读取操作用于数据包长度,另一个用于有效负载。因此,有两个I/O操作 或者,我可以这样做,我尽可能多地阅读,检查前2个字节,假设它是N,取N个字节,形成packet1和packet2。如果在读取packet1和packet2后还有剩余字节,请读取更多字节,然后再次按照上述方法处理字节缓冲区。在这个方法中,我做1个I/O,但需要遍历字节缓冲区 理论上哪个更快?我知道我必须实施和衡量这两个方面,但我只是想听听你们的建议C 您建议在Linux中使用哪种方法读取多播流?,c,linux,multicastsocket,C,Linux,Multicastsocket,我用C/C++在Linux中编写了一个程序,该程序读取多播数据包,并试图尽可能快地理解特定事件是否发生。延迟是这里的关键点 在协议中,前两个字节表示消息类型。 在我当前的实现中,我读取前两个字节,并根据消息类型决定应该为有效负载读取多少字节。也就是说,我对一个数据包执行两次读取操作。一个读取操作用于数据包长度,另一个用于有效负载。因此,有两个I/O操作 或者,我可以这样做,我尽可能多地阅读,检查前2个字节,假设它是N,取N个字节,形成packet1和packet2。如果在读取packet1和pa
谢谢我所知道的最快的方法是:
- 打开原始数据包套接字(AF_数据包)
- 实现一个BPF过滤器,它尽可能具体地过滤您需要的数据包
- 切换到内存映射环缓冲区(数据包MMAP/数据包RX\U环)
- 直接从内存中读取数据包,而不是使用
。这可以通过使用recv()
完成,或者,通过在内存包元数据上忙着循环来避免poll()
系统调用poll()
- 直接在环形缓冲区中处理数据包(零拷贝)
- 将缓冲区标记为“可供重用”