我理解这个问题已经讨论了很多次:我应该使用libpcap还是PF_PACKET(数据链接套接字)来捕获数据包?
根据我的研究,libpcap几乎在所有地方建议使用PF_PACKET,主要是因为它的可移植性.
但是,对于我目前的项目(在生产系统中使用),可移植性根本不是一个问题,我关心的只是性能(速度,丢包率).我的程序在CentOS 5.10(内核2.6.18)上运行
据我所知,libpcap为每个数据包设置了一个时间戳.这会导致大的性能损失吗?
还有其他因素导致libpcap在高速网络中不适用吗?
解决方法:
As far as I know, libpcap put a timestamp on each packet.
不,libpcap从它使用的OS数据包捕获机制获取数据包的时间戳 – 在Linux上是……
… PF_PACKET套接字.
Linux内核时间标记传入的数据包. PF_PACKET套接字有多种读取方式:
>常规套接字接收,你可以获得带有显式ioctl的时间戳(这样你就可以避免将它提取到用户区,但是你无法避免内核时间标记数据包; libpcap,当使用常规时socket接收,总是要求时间戳);
>内存映射访问,始终提供时间戳.
只要可用,Libpcap就会使用内存映射访问;如果你关心捕获性能,你可能也想这样做.但是,它并不容易使用.