2010-04-07 5 views
1

Je travaille avec libpcap en C sur linux (centos) et je suis this guide Je veux simplement imprimer tout le paquet en ASCII et j'ai réussi à le faire fonctionner en le mettant en u_char * dans la fonction "my_callback". Mais je ne peux pas comprendre comment obtenir la longueur des données. strstr n'a pas fonctionné. l'en-tête a un membre de len auquel vous pouvez accéder pour obtenir la taille mais je ne peux pas trouver quelque chose de similaire pour le * paquet étant passé. Toute aide est appréciée.libpcap packet size

+2

comme je ne sais pas, je ne suis pas poster comme une réponse ... mais il semble de quelques-unes des notes dans les en-têtes que le membre de Caplen serait la longueur des données. –

+0

Le paquet ne va pas être ASCII, donc traiter tous les octets de données comme une chaîne ASCII ne fonctionnera pas; en particulier, utiliser 'strstr()' est une mauvaise idée. Lisez le code dans ce guide, qui traite les données du paquet comme des données * binaires *. La réponse d'Einstein est correcte. utilisez le champ 'caplen' de' struct pcap_pkthdr' comme le nombre d'octets de données par paquets. –

Répondre

3

Dans votre rappel, le membre caplen de la variable pkthdr (voir struct pcap_pkthdr) contient la taille du paquet capturé. Par exemple, supposons qu'un paquet est capturé. Par exemple:

La longueur totale du cadre est de 1024 octets. Cependant, le pilote de capture n'a capturé que les 128 premiers octets du cadre et l'a rendu disponible pour votre rappel.

Dans ce cas, vous devriez vous attendre pkthdr-> Caplen à 128 et tête-> len être 1024.

1

La taille du paquet total est au champ « longueur totale » à l'en-tête IP (http://en.wikipedia.org/wiki/IPv4_header#Total_Length).

Comment obtenir cette valeur avec libpcap se trouve cet exemple: http://www.tcpdump.org/sniffex.c

Vous avez juste pour obtenir la valeur du champ que les références à la « longueur totale » (du nom ip_len) de cette variable :

const struct sniff_ip *ip;    /* The IP header */ 
+1

Non, c'est la longueur totale d'un paquet IPv4; tous les paquets ne sont pas des paquets IPv4 (ils peuvent être des paquets IPv6, des paquets ARP ou d'autres types de paquets), et la longueur du paquet IPv4 n'est pas la longueur du paquet entier sur le réseau - par exemple, pour Ethernet, il y a aussi l'en-tête Ethernet 14 octets et, si la longueur du paquet IPv4 + 14 est inférieure à 60, il y a aussi une bande passante Ethernet pour tamponner le paquet à 60 octets (64 octets si vous incluez le CRC) Segment Ethernet. –

+0

Est-il possible d'obtenir la longueur du paquet en utilisant libpcap, indépendamment du type de paquet (ip, arp, icmp ...)? – tremendows

+1

Oui - le champ 'len' de' struct pcap_pkthdr' est la longueur réelle du paquet sur le fil/sur les ondes (bien que, pour "on the air", notez que sur la plupart des plates-formes, sauf si vous capturez dans en mode moniteur, les paquets 802.11 sont transformés en paquets "faux Ethernet", et le champ "len" donne la fausse longueur du faux paquet Ethernet, pas la vraie longueur du paquet 802.11 "sur les ondes"). C'est * PAS * nécessairement la quantité de données de paquets réelles que vous avez dans la capture, cependant - c'est caplen'. –