2016-04-27 6 views
0

Я пытаюсь прочитать файл pcap для некоторой структуры данных, такой как вектор или массив, а затем использовать собранные данные (только выбранные как длина пакета, временная метка) в приложении. Я нашел пример приложения для чтения PCAP:Чтение файла pcap в вектор/массив

#include <stdio.h> 
#include <pcap.h> 

#define LINE_LEN 16 

void dispatcher_handler(u_char *, const struct pcap_pkthdr *, const u_char *); 

int main(int argc, char **argv) 
{ 
    pcap_t *fp; 
    char errbuf[PCAP_ERRBUF_SIZE]; 

    if(argc != 2) 
    { 
     printf("usage: %s filename", argv[0]); 
     return -1; 

    } 

    /* Open the capture file */ 
    if ((fp = pcap_open_offline(argv[1],   // name of the device 
         errbuf     // error buffer 
         )) == NULL) 
    { 
     fprintf(stderr,"\nUnable to open the file %s.\n", argv[1]); 
     return -1; 
    } 

    /* read and dispatch packets until EOF is reached */ 
    pcap_loop(fp, 0, dispatcher_handler, NULL); 

    pcap_close(fp); 
    return 0; 
} 



void dispatcher_handler(u_char *temp1, 
         const struct pcap_pkthdr *header, 
         const u_char *pkt_data) 
{ 
    u_int i=0; 

    /* 
    * unused variable 
    */ 
    (VOID*)temp1; 

    /* print pkt timestamp and pkt len */ 
    printf("%ld:%ld (%ld)\n", header->ts.tv_sec, header->ts.tv_usec, header->len); 

    printf("\n\n"); 

} 

Проблема с pcap_loop(). Я нашел documentation для этого, но единственной информацией является то, что это чтение всего файла, пока не будет достигнут конец файла. Я пытался обрабатывать файл как типичный FILE, а во время цикла читать до EOF, но он не работает, потому что я не могу просто обрабатывать fp как FILE.

Также я не вижу возможности передать указатель на pcap_handler, чтобы получить его позже.

Может кто-нибудь предложить, как я могу это сделать другим способом?

ответ

0

я после дополнительной документации и расследования Интернет я нашел функцию: pcap_next_ex()

Благодаря тому, что я могу теперь использовать во время цикла и читать построчно (точнее, пакет за пакетом). Основная идея заключается в следующем:

struct pcap_pkthdr *header; 
const u_char *pkt_data; 
int res; 

while((res = pcap_next_ex(fp, &header, &pkt_data)) >= 0) 
{ 
    //Process packet 
} 
0

Согласно документации, код выглядит правильно. pcap_loop должен делать чтение FILE, вы не должны пытаться это сделать.

Одна вещь, упомянутая в документе, заключается в том, что в старых версиях pcap 0 для count в pcap_loop не определено, поэтому должно быть безопаснее использовать -1, если вы ссылаетесь на более старую версию.

0

Я пытался лечить файл как типичный FILE, и в то время как цикл читать до EOF, но он не работает, потому что я не могу просто лечить fp как FILE.

Нет, потому что это не FILE. (Вы также получаете pcap_t * от pcap_open_live() или из комбинации pcap_create()/pcap_activate(), но это дает вам ручку для захвата живого, а не файл.)

Кроме того, я не вижу никакой возможности передать указатель до pcap_handler, чтобы получить его позже.

Четвертый аргумент pcap_loop() передается в качестве первого аргумента pcap_handler, так что вы могли бы сделать

pcap_loop(fp, 0, dispatcher_handler, pointer); 

, а затем, в dispatcher_handler(), отлитый temp1 к соответствующему типу и использовать его - это Я хочу указать то же, что и pointer.

 Смежные вопросы

  • Нет связанных вопросов^_^