2016-04-27 4 views
0

Ich versuche, PCAP-Datei zu einigen Datenstruktur wie Vektor oder Array zu lesen und später gesammelten Daten (nur ausgewählte wie Paketlänge, Zeitstempel) in Anwendung.Lesen von pcap-Datei zu Vektor/Array

#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"); 

} 

Das Problem ist mit pcap_loop(): Ich habe einige Beispielanwendung für das Lesen pcap gefunden. Ich habe documentation dafür gefunden, aber die einzige Information ist, dass dies ganze Datei liest, bis das Ende der Datei erreicht ist. Ich habe versucht, Datei als eine typische FILE behandeln, und in der While-Schleife bis EOF lesen, aber es funktioniert nicht, weil ich nicht einfach fp als FILE behandeln kann.

Auch ich sehe keine Möglichkeit, Zeiger auf pcap_handler übergeben, um es später abrufen.

Kann jemand vorschlagen, wie ich es anders machen kann?

Antwort

0

ich nach einem weiteren Dokumentation und Internet Untersuchung I Funktion gefunden habe: pcap_next_ex()

Dank, dass kann ich jetzt while-Schleife und lesen Sie Zeile für Zeile (oder genauer gesagt Paket für Paket) verwenden. Die allgemeine Idee ist wie folgt:

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

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

Laut Dokumentation sieht Ihr Code richtig aus. pcap_loop sollte die Datei lesen, Sie sollten nicht versuchen, es zu tun.

Eine Sache, die das Dokument erwähnt, ist, dass in älteren pcap-Versionen 0 für Count in pcap_loop undefiniert ist, so sollte es sicherer sein, -1 zu verwenden, wenn Sie eine ältere Version verknüpfen.

0

Ich habe versucht, Datei als typisches FILE zu behandeln, und in while-Schleife, bis EOF lesen, aber es funktioniert nicht, weil ich fp behandeln nicht einfach als FILE. Kein

, weil es nicht ein FILE. (Sie erhalten auch eine pcap_t * von pcap_open_live() oder aus einer pcap_create()/pcap_activate() Kombination, aber das gibt Ihnen einen Griff für eine Live-Aufnahme, nicht für eine Datei.)

Auch sehe ich keine Möglichkeit, Zeiger zu übergeben zu pcap_handler, um es später zu erhalten.

Das vierte Argument zu pcap_loop() wird als erstes Argument an pcap_handler, geführt, so konnte man

pcap_loop(fp, 0, dispatcher_handler, pointer); 

und dann in dispatcher_handler(), in den entsprechenden Typ temp1 und warf, verwenden - es Ich werde auf dasselbe hinweisen, was pointer tut.