2009-03-25 7 views
12

Ich brauche ein Programm, das die Anzahl der Pakete in einer Capture-Datei, die die pcap format verwendet, druckt. Diese Nummer scheint im pcap-Header nicht verfügbar zu sein (wahrscheinlich weil sie vor dem Capture geschrieben wurde) und es scheint nicht, dass es eine Fußzeile in der Datei mit diesen Informationen gibt.Die Anzahl der Pakete in einer pcap-Capture-Datei erhalten?

Also, ich glaube, der einzige Algorithmus ist, über alle Pakete Schleife und summieren sie. Es ist in O (N) und für große Spuren ziemlich lang.

Ich poste hier, um zu sehen, ob jemand eine klügere Idee hat?

Ich markierte mit "C", weil es die Sprache ist, die ich derzeit verwende, aber ich glaube, dass es ein sprachunabhängiges Problem ist.

+0

„Diese Nummer funktioniert nicht scheinen im pcap-Header verfügbar zu sein (wahrscheinlich, weil es vor dem Capture geschrieben wird) und es scheint nicht, dass es einen "Fuß" in der Datei mit diesen Informationen gibt."Ja, deshalb ist es nicht in der Kopfzeile (pcap-Dateien können in eine Pipe geschrieben werden, so dass Sie nicht zurück suchen und die Kopfzeile neu schreiben können, wenn Sie fertig sind), und nein, es gibt keine Fußzeile. –

Antwort

13

Robert Edmonds, Autor von pcaputils, sagte mir, dass es bereits ein Programm gibt, was ich will, Capinfos, im Wireshark-Paket. Es zeigt verschiedene Hinweise zu einer pcap-Datei an, einschließlich der Anzahl der darin enthaltenen Pakete.

Wenn Sie die Quelltextquelle lesen, scheint sie zu funktionieren, indem Sie die gesamte Datei nacheinander durchlaufen.

+0

Genau so funktioniert das. Im allgemeinen Fall (Wir Eshark kann eine Reihe verschiedener Capture-Dateiformate lesen, einschließlich pcap und pcap-ng, das ist die einzige Möglichkeit, wie es funktionieren kann, da die meisten Dateiformate zu Beginn keine Paketanzahl haben. –

+0

Um die genaue Anzahl der Pakete und nicht die lesbare Version anzuzeigen, versuchen Sie folgenden Befehl: capinfos -Mc file.pcap | grep "Nummer" | tr -d "" | cut -d ":" -f 2 – schuess

1

Die einzige mir bekannte Methode ist, die Datei zu lesen, den erfaßten Rahmen nach dem erfaßten Rahmen und einen "Paketzähler". Es gibt jedoch einen kleinen Rahmenkopf, der die Länge des gespeicherten Rahmens enthält, so dass Sie suchen können Weiterleiten in der Datei um diese Länge.Es kann nicht schneller sein, wohlgemerkt.

Wenn Sie jedoch mehr als nur die Anzahl der erfassten Bilder zählen möchten, kann es sinnvoll sein, die Daten zu lesen und erstellen Sie eine Kette von erfassten Frames, während Sie sie zählen, für die zukünftige Verwendung. Meine PCAP-Bibliothek für Common Lisp tut dies. Es liest "nächsten Frame" auf einer bedarfsweisen Basis, rohe Frames in einer doppelt verketteten Liste für die leichtere Zukunft speichern nächste/vorherige "Frame-Navigation, mehr Frames von der Festplatte nach Bedarf lesen. Allerdings die Parsing des Frames con Zelte bleiben dem Ermessen des Bibliotheksbenutzers überlassen und werden nicht durch einfaches Lesen der Rahmenoktette in die Datenstruktur erzwungen.

+0

In C , es gibt keine Notwendigkeit, die "kleinen Frame-Header verwenden, die die Länge des gespeicherten Rahmens enthält", pcap_next() tut es für Sie. – bortzmeyer

+0

Ihre Bibliothek ist http://www.suspicious.org/~night/plokami/? – bortzmeyer

+0

Meine Bibliothek kann von http://src.hexapodia.net/pcap.tar.gz heruntergeladen werden.Ich vermute, die Verwendung von pcap_next() wird einige Frame-Parsing tun, und das kann Dinge wesentlich langsamer machen, einer der Gründe, die ich geteilt habe "lesen packet "from" parse packet ". – Vatine

4

Die nur Weise zu bestimmen, wie viele Pakete in der Datei sind, ist die gesamte Datei zu lesen. Tatsächlich gibt es im Dateiheader keine Paketzählung (da das Format in einem Durchgang beschreibbar ist), und es gibt tatsächlich keine Fußzeile.

2

Wenn Sie wollen, dass die Nummer von Frames in der pcap:

tshark -r test.cap | wc -l 

Mit capinfos:

capinfos test.cap | grep "Number of packets"| tr -d " " | cut -d ":" -f 2 

Mit tcpdump:

tcpdump -r test.cap 2>/dev/null| wc -l 

Also im Grunde verwenden libpcap, Hier ist ein Beispiel:

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

int main(int argc, char **argv) 
{ 
    unsigned int packet_counter=0; 
    struct pcap_pkthdr header; 
    const u_char *packet; 

    if (argc < 2) { 
    fprintf(stderr, "Usage: %s <pcap>\n", argv[0]); 
    exit(1); 
    } 

    pcap_t *handle; 
    char errbuf[PCAP_ERRBUF_SIZE]; 
    handle = pcap_open_offline(argv[1], errbuf); 

    if (handle == NULL) { 
    fprintf(stderr,"Couldn't open pcap file %s: %s\n", argv[1], errbuf); 
    return(2); 
    } 

    while (packet = pcap_next(handle,&header)) { 

     packet_counter++; 

    } 
    pcap_close(handle); 


    printf("%d\n", packet_counter); 
    return 0; 
} 

HINWEIS: Sie müssen die libpcap Header (auf Linux Suche nach libpcap dev/Entwickler-Paket)

dann mit gcc kompilieren installieren -o myprogram myprogram.c -lpcap

+1

Oder führe einfach capinfos, die, wie tshark, Teil der Wireshark-Distribution sind und viel weniger Arbeit machen und die Antwort schneller produzieren. –

+0

Es gibt verschiedene Möglichkeiten, Dinge zu tun und abhängig von den Umständen ... – UnX

+0

Wenn die Umstände sind "Sie haben Wireshark installiert, es ist keine Version so alt, dass es Capinfos hat, und Sie wollen eine schnelle Zählung der Pakete in einem Datei "ist der beste Weg, Dinge zu tun, Capinfos zu verwenden. –