select()循环不适用于TPACKET_V3

select()循环不适用于TPACKET_V3,c,linux,sockets,select,pcap,C,Linux,Sockets,Select,Pcap,我的用户空间应用程序需要监听多个接口以捕获原始数据包。为此,我使用pcap原始捕获API。另外,我使用pcap\U get\U SELECTIVE\U fd使从pcap\U create返回的描述符可选择。这些描述符被进一步订阅到select()循环,以便使用FD_SET读取 这里的问题是,尽管我订阅了多个接口的select(),但应用程序只获得订阅的第一个接口的数据包 对于其余的接口,我可以看到数据包正在使用tcpdump到达这些接口。但由于某些原因,它不是从我的应用程序中的select()循

我的用户空间应用程序需要监听多个接口以捕获原始数据包。为此,我使用pcap原始捕获API。另外,我使用pcap\U get\U SELECTIVE\U fd使从pcap\U create返回的描述符可选择。这些描述符被进一步订阅到select()循环,以便使用FD_SET读取

这里的问题是,尽管我订阅了多个接口的select(),但应用程序只获得订阅的第一个接口的数据包

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

进一步研究pcap库,我发现问题与TPACKET_V3对pcap捕获的支持有关。如果禁用TPACKET_V3支持并使用TPACKET_V2,一切正常。来自所有接口的数据包都从select循环读取

我不知道这是否是TPACKET_V3的已知问题,但我真的希望TPACKET_V3在我的应用程序中提高性能。我想知道是否可以在启用TPACKET_V3支持的情况下使用select()循环

内核版本:2.6.33 LibPcap版本:1.0.0


提前感谢。

LibPcap版本1.0.0似乎没有TPACKET_V3支持。它从1.5.0开始。请参考以下链接@achoora这实际上是内核支持的问题,而不是libpcap。如果linux内核支持TPACKET_V3,那么我们可以使用setsockopt()在创建的套接字上激活它。2.6.33内核也不支持TPACKET_V3。因此,对于2.6.33内核和libpcap 1.0.0,这绝对不是TPACKET_V3的问题。如果您能够在libpcap中禁用TPACKET_V3支持并重建libpcap,那么您在libpcap 1.0.0中没有这样做-您使用的是哪个版本的libpcap?您真正使用的内核版本是什么?是的,2.6.33内核没有TPACKET_V3。但是我使用的是一个定制的内核,它支持从3.2内核向后移植的TPACKET_V3。所以,这就是我看到这个问题的地方。libpcap的版本是1.0.0。3.2内核中有解决这个问题的已知补丁吗?