libpcap отбрасывает некоторые пакеты с определенного IP
Я реализую сборщик пакетов, но я страдаю от отбрасывания пакетов.
Мой двоичный файл может получить большинство пакетов из некоторого определенного 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);
}
Есть ли идея для меня?
1 ответ
Поскольку вы упомянули, что вы можете получить все ip-пакеты на интерфейсе с помощью tcpdump, я бы посчитал, что следующая строка в вашем коде в порядке, если вы используете то же имя интерфейса для параметра dev, что и для tcpdump.
pcap_open_live(dev, BUFSIZ, PROMISCUOUS, -1, errbuf);
Проблема может быть в линии,
pcap_compile(pcd, &fp, port, 0, netp);
В приведенной выше строке переменная порта является строкой фильтра. Ваш сборщик пакетов будет собирать только те пакеты, которые проходят этот фильтр. Если вы не используете надлежащие параметры фильтра в строке вашего порта, чтобы разрешить также пакеты с IP-адресами 200.201.xx, вы не будете их перехватывать.