Не удается перехватить пакет с помощью libpcap - PullRequest
0 голосов
/ 03 мая 2019

Я новичок в использовании libpcap.

Я использую эту библиотеку для захвата пакета, и код, который я написал для захвата пакета, приведен ниже.

Интерфейс, который яПри прослушивании всегда заполняется пакет arp, поэтому на интерфейс всегда поступает пакет. Но я не могу подключить эти пакеты.Интерфейс работает и работает.Я не получил ошибку в функции pcap_open_live.

Код находится в C. И я запускаю этот код на 32-битной машине FreeBSD10.

void captutre_packet(char* ifname , int snaplen) {

    char ebuf[PCAP_ERRBUF_SIZE];
    int pflag = 0;/*promiscuous mode*/
    snaplen  = 100;
    pcap_t* pcap =  pcap_open_live(ifname, snaplen, !pflag , 0, ebuf);
    if(pcap!=NULL) {
            printf("pcap_open_live for %s  \n" ,ifname );   
    }

    int fd = pcap_get_selectable_fd(pcap);
    pcap_setnonblock(pcap, 1, ebuf);

    fd_set fds;
    struct timeval tv;

    FD_ZERO(&fds);
    FD_SET(fd, &fds);

    tv.tv_sec = 3;
    tv.tv_usec = 0;
    int retval = select(fd + 1, &fds, NULL, NULL, &tv);

    if (retval == -1)
            perror("select()");
        else if (retval) {
            printf("Data is available now.\n");
            printf("calling pcap_dispatch \n");
            pcap_dispatch(pcap , -1 , (pcap_handler) callback , NULL);
        }
        else
            printf("No data within 3 seconds.\n");
 }  
    void
    callback(const char *unused, struct pcap_pkthdr *h, uint8_t *packet)
    {
            printf("got some packet \n");
    }

Я всегда получаю значение 0, которое равнотайм-аут.Я не знаю, что происходит под капотом, я следую учебному пособию, и они также сделали то же самое, что я не знаю, что мне не хватает.

Я также хочу понять, как пакет изПосле того, как полученный уровень Ethernet копируется в этот открытый bpf-сокет / устройство (с использованием pcap_open_live) и как копируется буфер из пространства ядра в пространство пользователя?

И как долго мы можем нажатьпакет до тех пор, пока ядро ​​не поглотит или не отклонит пакет?

1 Ответ

0 голосов
/ 27 мая 2019

Вызов pcap_open_live() предоставил 0 в качестве значения тайм-аута буфера пакета (четвертый аргумент).libpcap не указывает, что означает значение 0, поскольку разные механизмы захвата пакетов в разных операционных системах обрабатывают это значение по-разному.

В системах, использующих BPF, таких как BSD и macOS, это означает «ждать добуфер пакетов полностью заполнен перед предоставлением пакетов. Если буфер пакетов большой (по умолчанию около 256 КБ во FreeBSD), а пакеты малы (60 байтов для пакетов ARP), это может занять значительное время длябуфер для заполнения - дольше, чем время ожидания, которое вы передаете select().

Вероятно, лучше иметь значение времени ожидания от 100 миллисекунд до 1 секунды, поэтому передайте аргумент где-то между 100 и 1000не 0.

...