2009-03-25 9 views
12

Ho bisogno di un programma che stampi il numero di pacchetti in un file di acquisizione che utilizza lo pcap format. Questo numero non sembra disponibile nell'intestazione pcap (probabilmente perché è scritto prima dell'avvio della cattura) e non sembra che ci sia un "piè di pagina" nel file, con queste informazioni.Ottenere il numero di pacchetti in un file di cattura pcap?

Quindi, credo che l'unico algoritmo sia quello di eseguire il loop su tutti i pacchetti e sommarli. È in O (N) e, per grandi tracce, abbastanza lungo.

Io posto qui per vedere se qualcuno ha un'idea più intelligente?

Ho taggato con "C" perché è la lingua che attualmente utilizzo ma credo che sia un problema indipendente dalla lingua.

+0

"Questo numero non lo fa sembra disponibile nell'intestazione pcap (probabilmente perché è scritto prima dell'avvio della cattura) e non sembra che ci sia un "piè di pagina" nel file, con queste informazioni."Sì, è per questo che non è nell'intestazione (i file pcap possono essere scritti in una pipe, quindi non è possibile cercare e riscrivere l'intestazione quando hai finito), e, no, non c'è il piè di pagina. –

risposta

13

Robert Edmonds, autore di pcaputils, mi ha detto che esiste già un programma che fa ciò che voglio, capinfos, nel pacchetto Wireshark. Visualizza varie indicazioni su un file pcap, incluso il numero di pacchetti che contiene.

Leggere il codice sorgente, sembra funzionare camminando sull'intero file, in sequenza.

+0

Questo è esattamente il modo in cui funziona. Nel caso generale (Wir eshark può leggere diversi formati di file di acquisizione, tra cui pcap e pcap-ng), questo è l'unico modo in cui può funzionare, dato che molti formati di file non hanno un conteggio di pacchetti all'inizio. –

+0

Per visualizzare il numero esatto di pacchetti e non la versione leggibile dall'uomo, provare il seguente comando: capinfos -Mc file.pcap | grep "Numero" | tr -d "" | cut -d ":" -f 2 – schuess

1

L'unico metodo che conosco è leggere il file, catturare il fotogramma per fotogramma acquisito e incrementare un "contatore di pacchetti. C'è, tuttavia, una piccola intestazione di frame che contiene la lunghezza del frame memorizzato, quindi è possibile cercare inoltra nel file di quella lunghezza. Potrebbe non essere più veloce, non importa.

Tuttavia, se sei interessato a fare di più che contare semplicemente il numero di fotogrammi catturati, può essere sensato leggere i dati e costruisco una catena di fotogrammi catturati contando su di essi, per un uso futuro.La mia libreria PCAP per Common Lisp esegue questa operazione, legge "next frame" in base alle necessità, memorizzando i frame non elaborati in un elenco a doppio collegamento per un futuro più facile " next/previous "frame navigation, leggendo più frame dal disco in base alle esigenze, tuttavia, l'analisi del frame con le tende sono lasciate alla discrezione dell'utente della biblioteca e non vengono applicate semplicemente leggendo i frame ottetti nella struttura dati.

+0

In C , non è necessario utilizzare l'intestazione "piccolo frame che contiene la lunghezza del frame memorizzato", pcap_next() lo fa per te. – bortzmeyer

+0

La tua libreria è http://www.suspicious.org/~night/plokami/? – bortzmeyer

+0

La mia libreria può essere scaricata da http://src.hexapodia.net/pcap.tar.gz. Sospetto che l'uso di pcap_next() eseguirà qualche analisi dei fotogrammi e che possa rendere le cose più arbricamente più lente, uno dei motivi per cui ho diviso "leggi pacchetto "da" parse packet ". – Vatine

4

Il solo modo per determinare quanti pacchetti sono nel file è quello di leggere l'intero file. Non c'è, infatti, nessun conteggio dei pacchetti nell'intestazione del file (perché il formato è stato progettato per essere scrivibile in un unico passaggio) e non c'è, in effetti, nessun piè di pagina.

2

Se si desidera che il numero di fotogrammi nel pcap:

tshark -r test.cap | wc -l 

Uso capinfos:

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

Utilizzando tcpdump:

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

Quindi, fondamentalmente, usare libpcap, ecco un esempio:

#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; 
} 

NOTA: è necessario installare le intestazioni libpcap (sulla ricerca di Linux per libpcap dev/devel)

quindi compilare con gcc -o myprogram myprogram.c -lpcap

+1

O semplicemente esegui capinfos, che, come tshark, fa parte della distribuzione di Wireshark e che fa molto meno lavoro e produrrà la risposta più velocemente. –

+0

Ci sono diversi modi per fare le cose e in base alle circostanze ... – UnX

+0

Se le circostanze sono "hai installato Wireshark, non è una versione così vecchia che non ha capinfos, e vuoi un rapido conteggio dei pacchetti in un file ", il modo migliore per fare le cose è usare capinfos. –

Problemi correlati