Question

J'ai besoin d'un programme qui imprime le nombre de paquets dans un fichier de capture qui utilise le format PPCE . Ce nombre ne semble pas disponible dans l'en-tête de PPCE (probablement parce qu'il est écrit avant la capture commence) et il ne semble pas qu'il y ait un « pied de page » dans le fichier, avec ces informations.

Alors, je crois que le seul algorithme est en boucle sur tous les paquets et les récapituler. Il est en O (N) et, pour les grandes traces, assez longue.

Je posterai ici pour voir si quelqu'un a une idée plus intelligent?

Je tagguées avec « C », car il est la langue que je l'utilise actuellement, mais je crois qu'il est une question de langue indépendante.

Était-ce utile?

La solution

Robert Edmonds, auteur de pcaputils, m'a mentionné qu'il existe déjà un programme à faire ce que je veux, capinfos, dans le paquet Wireshark. Il affiche diverses indications relatives à un fichier pcap, y compris le nombre de paquets qu'il contient.

Lecture de la source de code, il semble fonctionner en marchant le fichier entier, de manière séquentielle.

Autres conseils

uniquement façon de déterminer le nombre de paquets sont dans le fichier est de lire le fichier entier. Il y a, en effet, compter aucun paquet dans l'en-tête de fichier (parce que le format a été conçu pour être accessible en écriture en un seul passage), et il y a, en fait, pas de bas de page.

Si vous voulez que le nombre de cadres dans le PPCE:

tshark -r test.cap | wc -l

Utilisation capinfos:

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

Utilisation tcpdump:

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

Donc, fondamentalement, utiliser libpcap, voici un exemple:

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

REMARQUE: vous devez installer les en-têtes de libpcap (sur la recherche Linux pour libpcap dev / devel)

Puis compiler avec gcc -o myprogram myprogram.c -lpcap

La seule méthode que je connaisse est de lire le fichier, l'image capturée par image capturée et incrémenter un « compteur de paquets. Il est, cependant, un petit-tête de trame qui contient la longueur de la trame stockée, de sorte que vous pourriez rechercher avant dans le fichier par cette longueur. Il ne peut être plus vite, vous l'esprit.

Cependant, si vous êtes intéressés à faire plus que simplement compter le nombre d'images capturées, il peut être judicieux de lire les données et construire une chaîne d'images capturées tout en comptant, pour une utilisation future. Ma bibliothèque PPCE for Common Lisp fait cela. Il lit « image suivante » sur une base au besoin, le stockage images brutes dans une liste à double lien pour faciliter l'avenir « suivant / précédent » navigation image, la lecture plus d'images à partir du disque au besoin. Cependant, l'analyse du contenu de la trame sont laissés à la discrétion de l'utilisateur de la bibliothèque et n'est pas appliquée en lisant simplement les octets de trame dans la structure de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top