Frage

Ich brauche ein Programm, das die Anzahl der Pakete in einer Sammlungsdatei druckt, die das PCAP-Format . Diese Zahl ist nicht verfügbar scheint im PCAP-Header (wahrscheinlich, weil es geschrieben wird, bevor die Erfassung beginnt), und es scheint nicht, gibt es einen „Footer“ in der Datei mit diesen Informationen.

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

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

ich mit „C“ gekennzeichnet, weil es die Sprache, die ich zur Zeit benutzen, aber ich glaube, es ist eine Sprache-unabhängige Problem.

War es hilfreich?

Lösung

Robert Edmonds, Autor von pcaputils, mir gegenüber erwähnt, dass es bereits ein Programm zu tun, was ich will, capinfos, in dem Wireshark-Paket. Es zeigt verschiedene Hinweise auf eine pcap-Datei, einschließlich der Anzahl der Pakete enthalten ist.

, um den Quellcode lesen, scheint es zu Fuß die ganze Datei zu arbeiten, der Reihe nach.

Andere Tipps

Die nur Art und Weise zu bestimmen, wie viele Pakete in der Datei ist, die gesamte Datei zu lesen. Es gibt in der Tat zählt kein Paket im Dateikopf (weil das Format in einem Durchgang beschreibbar sein wurde entwickelt), und es gibt in der Tat keine Fußzeile.

Wenn Sie die Nummer von Frames im pcap:

tshark -r test.cap | wc -l

capinfos verwenden:

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 libpcap zu verwenden, 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 installieren (auf Linux Suche nach libpcap dev / Entwickler-Paket)

Dann kompilieren mit gcc -o myprogram myprogram.c -lpcap

Die einzige Methode, die ich kenne, ist die Datei, erfassten Bild von erfassten Bild zu lesen und einen „Paketzähler zu erhöhen. Es ist jedoch ein kleiner Rahmenkopf, den die Länge des gespeicherten Rahmens enthält, so dass Sie nach vorne suchen könnten in der Datei, die von dieser Länge. Es kann nicht schneller, Geist Sie sein.

Wenn Sie jedoch daran interessiert sind mehr zu tun, als nur die Anzahl der aufgenommenen Bilder zählen, kann es sinnvoll sein, durch die Daten zu lesen und eine Kette von aufgenommenen Frames aufzubauen, während sie zu zählen, für die zukünftige Verwendung. Meine PCAP-Bibliothek für Common Lisp tut dies. Er liest „nächsten Frame“ auf einer Basis nach Bedarf, rohen Frames in einer Doppelverbundliste für eine einfachere Zukunft „Vor / Zurück“ frame Navigation zu speichern, mehr Bilder von der Festplatte lesen, wie gebraucht. Allerdings sind die Analyse der Rahmeninhalte links nach dem Ermessen des Bibliotheksbenutzer und wird nicht durch einfaches Lesen der Rahmen Oktetts in die Datenstruktur erzwungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top