2017-10-13 6 views
0

Je lis des paquets stockés dans des fichiers en utilisantC++ - Comment stocker des paquets de lecture hors ligne en utilisant pcap_next_ex dans un vecteur?

struct pcap_pkthdr *header; 
const u_char *packetData; 
pcap_next_ex(pcap, &header, &packetData) 

et je besoin de lire tous les paquets et stocker chaque paquet (en-tête de paquet et données par paquets) dans le vecteur de struct

struct packetStruct { 
    struct pcap_pkthdr *header; 
    const u_char *packetData; 
}; 

Mais quand je cède seulement des pointeurs pointant vers la mémoire avec les données d'en-tête et de paquet vers ces pointeurs de structure et poussant cette structure vers le vecteur, tous les pointeurs dans le vecteur pointent vers le dernier paquet après lecture de la boucle (la fonction stocke les paquets dans la même mémoire).

Dois-je allouer de la nouvelle mémoire pour les données d'en-tête et de paquet et si oui, quelle devrait être la taille de cette mémoire? Ou y a-t-il un autre moyen?

Merci pour les réponses

+1

Ecrivez-vous C ou C++? Ce sont des langues différentes – Caleth

Répondre

0

Oui, vous devez allouer une nouvelle mémoire pour l'en-tête et le paquet. Les pointeurs que vous obtenez de pcap_next_ex sont réutilisés par libpcap/WinPcap, donc vous ne pouvez pas supposer que la mémoire allouée pour un certain paquet sera disponible quand le paquet suivant arrive, et ainsi de suite.

La taille de la mémoire que vous devez allouer est pcap_pkthdr. Vous avez 2 champs de longueur à considérer:

  • len - contient la longueur du paquet complet (hors fil)
  • caplen - contient la longueur des données réellement allouées

Habituellement len et caplen sera égal mais parfois, pour plusieurs raisons possibles, caplen sera inférieur à len