select()循环不能与TPACKET_V3一起使用

时间:2016-04-07 11:37:16

标签: c linux sockets select pcap

我的用户空间应用程序需要侦听多个接口以捕获原始数据包。为此,我正在使用pcap原始捕获API。此外,我正在使用 pcap_get_selectable_fd 选择从 pcap_create 返回的描述符。这些描述符还使用FD_SET订阅了select()循环以进行读取。

这里的问题是虽然我订阅了多个接口的select(),但应用程序只为订阅的第一个接口获取数据包。

对于其余的接口,我可以看到数据包使用tcpdump到达这些接口。但由于某种原因,它不会从我的应用程序中的select()循环中获取。

进一步进入pcap库,我发现问题与TPACK捕获的TPACKET_V3支持有关。如果我禁用TPACKET_V3支持并使用TPACKET_V2,一切正常。所有接口的数据包都在从选择循环中读取。

我不知道这是否是TPACKET_V3的一些已知问题,但我真的想在我的应用程序中提升TPACKET_V3的性能。我想知道是否可以使用启用了TPACKET_V3支持的select()循环。

内核版本:2.6.33 LibPcap版本:1.0.0

提前致谢。

0 个答案:

没有答案