Pregunta

Necesito un programa que imprime el número de paquetes en un archivo de captura que utiliza el formato PCAP . No parece este número disponible en la cabecera pcap (probablemente porque está escrito antes de que comience la captura) y no parece que hay un "pie de página" en el archivo, con esta información.

Por lo tanto, creo que el único algoritmo es un bucle sobre todos los paquetes y la suma de ellos. Es en O (N) y, para las grandes trazas, bastante largo.

he puesto aquí para ver si alguien tiene una idea más inteligente?

I marcada con "C" porque es el lenguaje que uso actualmente, pero creo que es un problema de idioma-independiente.

¿Fue útil?

Solución

Robert Edmonds, autor de pcaputils, me mencionó que ya hay un programa de hacer lo que quiero, capinfos, en el paquete de Wireshark. Se muestra diversas indicaciones acerca de un archivo pcap, incluyendo el número de paquetes que contienen.

Al leer el código fuente, que parece funcionar al caminar todo el archivo, de forma secuencial.

Otros consejos

El única manera para determinar cuántos paquetes se encuentran en el archivo es leer el archivo completo. Hay, de hecho, cuenta ningún paquete en la cabecera del archivo (debido a que el formato fue diseñado para tener permiso de escritura en una sola pasada), y no es, de hecho, ningún pie de página.

Si desea que el número de Marcos en el PCAP:

tshark -r test.cap | wc -l

El uso de capinfos:

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

El uso de tcpdump:

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

Así que, básicamente, utilizar libpcap, aquí es un ejemplo:

#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: es necesario instalar las cabeceras libpcap (en la búsqueda de Linux para libpcap dev paquete / desa)

A continuación, compilar con gcc -o miprograma myprogram.c -lpcap

El único método que conozco es leer el archivo, fotograma capturado por fotograma capturado e incrementar un "contador de paquetes. Hay, sin embargo, una pequeña cabecera de la trama que contiene la longitud de la trama almacenada, por lo que podría ir hacia adelante en el archivo de esa longitud. no puede ser más rápido, claro está.

Sin embargo, si usted está interesado en hacer algo más que simplemente contar el número de fotogramas capturados, puede tener sentido para leer los datos y construir una cadena de fotogramas capturados, mientras que contarlos, para su uso futuro. Mi biblioteca PCAP para Common Lisp hace esto. Se lee "siguiente fotograma" en una función de las necesidades, almacenar tramas primas en una lista ligada doble para el futuro marco de navegación más fácil "siguiente / anterior", la lectura más marcos de disco según sea necesario. Sin embargo, el análisis de los contenidos de bastidor se deja a discreción del usuario de la biblioteca y no es impuesta por la simple lectura de los octetos de trama en la estructura de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top