我正在实施数据包收集器,但我遇到数据包丢失。
我的二进制文件可以从某个特定的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);
}
对我有什么想法吗?
答案 0 :(得分:0)
既然你提到你可以使用 tcpdump 获取接口上的所有ip数据包,我会认为你的代码中的以下行是可以的,只要你使用相同的接口名称用于 tcpdump 的参数 dev 。
pcap_open_live(dev, BUFSIZ, PROMISCUOUS, -1, errbuf);
问题可能在于,
pcap_compile(pcd, &fp, port, 0, netp);
在上面一行中, port 变量是一个过滤字符串。您的数据包收集器将仅收集通过此过滤器的数据包。如果您未在 port 字符串中使用正确的过滤器参数以允许涉及IP地址 200.201.x.x 的数据包,则不会捕获它们。