C - Невозможно установить фильтр pcap. функция не работает должным образом

Когда я пытаюсь запустить эту функцию, она сталкивается со стеной на втором if выписка и печать:cannot set pcap filter: ip dest host 92.40.255.82 ��z]$ (обратите внимание на нечетные символы в конце). Я подозреваю, что ошибка заключается в bpf_program filterprog но не повезло разобраться. Я проверил соответствующие справочные страницы, и если я что-то пропустил, функции, которые я использовал, должны быть в порядке... так что я в тупике. Это как-то связано с символами в конце сообщения об ошибке? Почему бы не установить фильтр?

void capture()
{
pcap_t *pd;
bpf_u_int32 netmask;
bpf_u_int32 localnet;
char filterbuf[64];
snprintf(filterbuf, sizeof(filterbuf), "ip dest host %s", dstip); 
char *filter = filterbuf;       
char *dev = NULL;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program filterprog;
int dl = 0, dl_len = 0;

if ((pd = pcap_open_live(dev, 1514, 1, 500, errbuf)) == NULL) 
    {           
        fprintf(stderr, "cannot open device %s: %s\n", dev, errbuf);
        exit(1);
    }

pcap_lookupnet(dev, &localnet, &netmask, errbuf);
pcap_compile(pd, &filterprog, filter, 0, localnet);
if (pcap_setfilter(pd, &filterprog) == - 1)
    {
        fprintf(stderr, "cannot set pcap filter: %s %s\n", filter, errbuf);
        exit(1);
    }

pcap_freecode(&filterprog);
dl = pcap_datalink(pd);

switch(dl) {
    case 1:
        dl_len = 14;
        break;
    default:
        dl_len = 14;
        break;
}       

if (pcap_loop(pd, -1, receive, (u_char *) &dl_len) < 0) 
    {
        fprintf(stderr, "cannot get raw packet: %s\n", pcap_geterr(pd));
        exit(1);
    }
}

edit: это другие ссылки на dstip:

(в прототипах) char *dstip = 0;

(в основном) dstip = optarg;

1 ответ

Решение

Ваш фильтр неправильный (с / б ip dst hostне ip dest host) причина плохих сообщений:

errbuf - возвращает текст ошибки и устанавливается только в случае сбоя подпрограммы pcap_lookupnet

После успешного завершения подпрограмма pcap_setfilter возвращает 0. Если подпрограмма pcap_setfilter не удалась, возвращается -1. В этом случае подпрограмма pcap_geterr может использоваться для получения текста ошибки, а подпрограмма pcap_perror может использоваться для отображения текста.

Другие вопросы по тегам