libpcap从特定IP丢弃一些数据包

libpcap从特定IP丢弃一些数据包,c,pcap,libpcap,C,Pcap,Libpcap,我正在实现数据包收集器,但我遭受数据包丢失的痛苦 我的二进制文件可以从某个特定的IP区域获取大部分数据包。(例如100.101.1.1、100.101.2.1)。但对于某些特定的IP区域,我无法获得任何数据包。(例如200.201.1.1、200.201.2.1) 此时,tcpdump可以从任何IP区域获取数据包 我的实现中的pcap代码片段如下所示: struct bpf_program fp; pcap_t *pcd; char errbuf[PCAP_ERRBUF_SIZE]; bpf_u

我正在实现数据包收集器,但我遭受数据包丢失的痛苦

我的二进制文件可以从某个特定的IP区域获取大部分数据包。(例如100.101.1.1、100.101.2.1)。但对于某些特定的IP区域,我无法获得任何数据包。(例如200.201.1.1、200.201.2.1)

此时,tcpdump可以从任何IP区域获取数据包

我的实现中的pcap代码片段如下所示:

struct bpf_program fp;
pcap_t *pcd;
char errbuf[PCAP_ERRBUF_SIZE];
bpf_u_int32 netp;
char port[16], dev[16];
......
pcd = pcap_open_live(dev, BUFSIZ, PROMISCUOUS, -1, errbuf);
pcap_compile(pcd, &fp, port, 0, netp);
pcap_setfilter(pcd, &fp);
while(1){
    packet = pcap_next(pcd, &hdr);
}

对我有什么想法吗?

因为你提到你可以使用TCPDUMP在接口上获取所有的IP数据包,我想你的代码中的以下行是正确的,只要你为TCPDUMP使用参数DEV的相同的接口名称。 问题可能就在这条线上

pcap_compile(pcd, &fp, port, 0, netp);

在上行中,端口变量是一个筛选器字符串。您的数据包收集器将只收集通过此筛选器的数据包。如果您没有在端口字符串中使用适当的筛选器参数来同时允许包含ip地址200.201.x.x的数据包,您将不会捕获它们。

添加
ifconfig
的输出以及用于运行tcpdump的命令行。您正在寻找的IP是否不在您正在打开的接口上?什么是dev?如果传递null或any而不是dev,则应该能够从所有接口捕获数据包。
pcap_compile(pcd, &fp, port, 0, netp);