我有一个绑定到 NIC 的套接字,我用它来捕获 pcap_loop 中的数据包。
我有一个单独的进程正在运行,最终在同一设备上执行“读取”,但只有在准备好读取 unix 本地管道之后。是否正确地说第二个进程的设备上的 read() 将读取准备好的所有内容,而不仅仅是一个数据包,即使我的另一个进程设置为使用 pcap_loop 一次读取一个数据包?
我有一个绑定到 NIC 的套接字,我用它来捕获 pcap_loop 中的数据包。
你说“socket”,所以我猜这是 Linux(它也可能是 IRIX,但这不太可能,而且在任何一种情况下答案都是一样的;其他操作系统不使用 libpcap 中的套接字,这些操作系统上的本机捕获机制使用套接字以外的机制)。
我有一个单独的进程正在运行,最终在同一设备上执行“读取”,但只有在准备好读取 unix 本地管道之后。是否正确地说第二个进程的设备上的 read() 将读取准备好的所有内容,而不仅仅是一次一个数据包,
不,PF_PACKET 套接字一次从read()
.
顺便说一句,不能保证从套接字读取并同时在 libpcap 中处理同一个套接字会起作用。Libpcap 可能正在使用内存映射机制来获取数据包;除非您在read()
其他地方看到过有关内存映射机制如何与 s 一起工作的文档,或者已经阅读了足够多的 Linux 内核代码来弄清楚它是如何工作的,否则您可能不想假设它会按照您想要的方式工作。
但是,如果这是 FreeBSD,正如标签所建议(但未说明),那么 libpcap 使用的是 BPF 设备,*不是*套接字。Aread()
会给你一个完整的数据包缓冲,并且read()
libpcap 完成的 s 会给 libpcap 一个完整的数据包缓冲,即使它碰巧每个数据包调用一次你的回调。可能会出现与内存映射访问相同的问题read()
,但在 FreeBSD 的更高版本中,内存映射 BPF 默认情况下不被 libpcap 使用。