Pergunta

Eu preciso de um programa que imprime o número de pacotes em um arquivo de captura que usa o pcap formato . Este número não parece disponível no cabeçalho pcap (provavelmente porque está escrito antes do início de captura) e não parece há um "rodapé" no arquivo, com esta informação.

Então, eu acredito que o único algoritmo é loop sobre todos os pacotes e somá-los. É em O (N) e, para grandes traços, bastante longo.

eu posto aqui para ver se alguém tem uma idéia inteligente?

I marcados com "C", porque é a linguagem que eu uso atualmente, mas eu acredito que é uma questão de linguagem independente.

Foi útil?

Solução

Robert Edmonds, autor de pcaputils, mencionou para mim que já existe um programa fazendo o que eu quero, capinfos, no pacote Wireshark. Ele exibe várias indicações sobre um arquivo pcap, incluindo o número de pacotes que contêm.

A leitura do código fonte, parece trabalho a pé todo o arquivo, sequencialmente.

Outras dicas

O única maneira de determinar quantos pacotes estão no arquivo é ler o arquivo inteiro. Há, na verdade, nenhum número de pacotes no cabeçalho do arquivo (porque o formato foi projetado para ser gravável em uma passagem), e não há, de fato, nenhum rodapé.

Se você deseja que o número de Quadros na pcap:

tshark -r test.cap | wc -l

Usando capinfos:

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

Usando tcpdump:

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

Então, basicamente, o uso libpcap, aqui está um exemplo:

#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: é necessário instalar os cabeçalhos libpcap (em Linux procurar libpcap dev / devel pacote)

Depois de compilação com gcc -o meuprograma myprogram.c -lpcap

O único método que eu conheço é para ler o arquivo, quadro capturado por quadro capturado e incrementar um "contador de pacotes. Há, no entanto, um pequeno cabeçalho do quadro que contém o comprimento do quadro armazenado, assim que você poderia procurar para a frente no arquivo por esse comprimento. pode não ser mais rápido, você mente.

No entanto, se você estiver interessado em fazer mais do que simplesmente contar o número de quadros capturados, pode fazer sentido para ler os dados e construir uma cadeia de quadros capturados durante a contagem deles, para uso futuro. Minha biblioteca PCAP para Common Lisp faz isso. Lê-se "próximo quadro" em uma base como necessária, armazenar quadros crus em uma lista duplamente ligada para o futuro mais fácil "seguinte / anterior" navegação de quadros, a leitura mais quadros do disco, conforme necessário. No entanto, a análise do conteúdo do quadro são deixados a critério do usuário da biblioteca e não é imposta pela simples leitura dos octetos quadro na estrutura de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top