4

我正在实现数据包收集器,但我遭受数据包丢失的困扰。

我的二进制文件可以从某个特定 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);
}

对我有什么想法吗?

4

1 回答 1

0

既然您提到您可以使用tcpdump获取接口上的所有 ip 数据包,我会认为您的代码中的以下行是可以的,只要您使用与用于tcpdump的参数dev相同的接口名称。

pcap_open_live(dev, BUFSIZ, PROMISCUOUS, -1, errbuf);

问题可能出在一线,

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

在上面的行中,端口变量是一个过滤字符串。您的数据包收集器只会收集通过此过滤器的数据包。如果您没有在端口字符串中使用正确的过滤器参数来允许涉及 IP 地址200.201.xx的数据包,您将不会捕获它们。

于 2013-09-17T11:15:16.060 回答