J'écris un analyseur de paquets en C en utilisant la bibliothèque libpcap. Voici le code simple
int main(int argc, char *argv[])
{
pcap_t *pcap;
const unsigned char *packet;
char errbuf[PCAP_ERRBUF_SIZE];
struct pcap_pkthdr header;
clock_t begin = clock();
// Type your interface name here
char *device = "ens33";
char error_buffer[PCAP_ERRBUF_SIZE];
pcap_t *handle;
int timeout_limit = 10000; // milliseconds
if (device == NULL)
{
printf("Error finding device: %s\n", error_buffer);
return 1;
}
// For live packet capturing
handle = pcap_open_live(
device,
BUFSIZ,
0,
timeout_limit,
error_buffer);
if (handle == NULL)
{
printf("Error getting handle%s\n", error_buffer);
return 2;
}
pcap_loop(handle, 0, dump_UDP_packet, NULL);
clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Program completed: total packets processed: %d (non UDP/Radius packets: %d) in %f seconds\n", count, non_packets, time_spent);
return 0;
}
J'utilise tcpreplay pour lire le trafic en direct à partir d'un fichier pcap. Cependant, mon programme n'est capable de traiter/lire qu'environ 80 000 paquets d'un fichier de 240 000 paquets. Lorsque j'essaie de lire les mêmes paquets à partir de tcpdump, je n'obtiens aucune perte de paquets.
Cela est-il dû à la taille de la mémoire tampon ? Comment puis-je m'assurer que les paquets ne sont pas perdus ?
Le tcpreplay prend environ 1,5 à 2 secondes à haute vitesse (~500MB/sec).
Je l'utilise sur Ubuntu 18.04 (32 Go de RAM, processeur 24 cœurs).