Domanda

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

Quindi, credo che l'unico algoritmo è a ciclo su tutti i pacchetti e li riassumo. E 'in O (N) e, per le grandi tracce, piuttosto lungo.

I post qui per vedere se qualcuno ha un'idea intelligente?

I tag "C", perché è la lingua che attualmente uso, ma credo che sia un problema di lingua-indipendente.

È stato utile?

Soluzione

Robert Edmonds, autore di pcaputils, ha detto a me che c'è già un programma di fare quello che voglio, capinfos, nel pacchetto Wireshark. Esso mostra varie indicazioni su un file pcap, tra cui il numero di pacchetti che contengono.

La lettura del codice sorgente, sembra funzionare a piedi l'intero file, in modo sequenziale.

Altri suggerimenti

solo modo per determinare quanti pacchetti sono nel file è quello di leggere l'intero file. V'è, infatti, contano nessun pacchetto nell'intestazione del file (perché il formato è stato progettato per essere scrivibile in un solo passaggio), e non v'è, in realtà, non piè di pagina.

Se si desidera che il numero di fotogrammi della pcap:

tshark -r test.cap | wc -l

Utilizzando 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 pacchetto dev / devel)

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

L'unico metodo che conosco è quello di leggere il file, fotogramma catturato per fotogramma catturato e incrementare un "contatore di pacchetti. V'è, tuttavia, un piccolo colpo di testa cornice che contiene la lunghezza del quadro memorizzato, così si potrebbe cercare in avanti nel file da quella lunghezza. Esso non può essere più veloce, si badi bene.

Tuttavia, se siete interessati a fare di più che semplicemente contare il numero di fotogrammi catturati, può essere utile per leggere i dati e costruire una catena di fotogrammi catturati mentre li conta, per un utilizzo futuro. La mia libreria PCAP per Common Lisp fa questo. Si legge "fotogramma successivo" su una base alle necessità, la memorizzazione fotogrammi prime in una lista doppia-linked per una più facile futuro "prossima / precedente" navigazione telaio, la lettura più fotogrammi dal disco, se necessario. Tuttavia, l'analisi dei contenuti del frame sono lasciati alla discrezione dell'utente biblioteca e non viene applicata con la semplice lettura degli ottetti del telaio nella struttura dei dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top