用pcap读取套接字

时间:2012-09-25 00:53:43

标签: sockets freebsd pcap

我有一个绑定到NIC的套接字,用于捕获pcap_loop中的数据包。

我有一个单独的进程运行,最终在同一设备上执行“读取”,但只有在准备好读取unix本地管道之后。说来自第二个进程的设备上的read()是否会读取所有已准备好的内容,而不是一次只读取一个数据包,即使我的其他进程设置为使用pcap_loop一次读取数据包也是正确的吗?

1 个答案:

答案 0 :(得分:2)

  

我有一个绑定到NIC的套接字,用于捕获pcap_loop中的数据包。

你说" socket",所以我猜这是Linux(也可能是IRIX,但这种可能性很小,答案也是如此case;其他操作系统不使用libpcap中的套接字,这些操作系统上的本机捕获机制使用套接字以外的机制。)

  

我有一个单独的进程运行,最终会执行" read"在同一设备上,但只有在准备好读取unix本地管道之后。说来自第二个进程的设备上的read()将读取所有准备好的内容,而不是一次只读取一个数据包,这是正确的吗

没有。 PF_PACKET套接字一次从read()返回一个数据包。

顺便说一句,不能保证从读取套接字读取并同时处理libpcap中的相同套接字将起作用。 Libpcap可能正在使用内存映射机制来获取数据包;除非你已经看过关于内存映射机制如何与其他地方完成的read()一起工作的文档,或者已经阅读了足够的Linux内核代码来弄清楚它是如何工作的,你可能不想假设它#39 ;按你想要的方式工作。

但是,如果这是FreeBSD,正如标签所建议的那样(但没有说明),那么libpcap使用的是BPF设备, * NOT * a插座。 read()将为您提供整个缓冲区数据包,和libpcap完成的read()将为libpcap提供整个缓冲区数据包,即使它恰好调用了您的回调每包一次。可能会出现read()与内存映射访问相同的问题,但是在FreeBSD的更高版本中,内存映射的BPF默认情况下不会被libpcap使用。