2010-10-15 7 views
4

J'ai vu ce genre de code utilisé dans un projet:la bonne façon d'utiliser pcap_next_ex ou pcap_next (libpcap)

while (1) 
{ 
    l_numPkts = pcap_next_ex(m_pcapHandle, &header, &pkt_data); 
    //do something 
    memcpy(dst,pkt_data,size);  
} 

après le retour de pcap_next_ex, l'état du paquet sera mis TP_STATUS_KERNEL, ce qui signifie que le buf était retourner au noyau. Code :

/* next packet */ 
switch (handle->md.tp_version) { 
    case TPACKET_V1: 
    h.h1->tp_status = TP_STATUS_KERNEL; 
.. 

dans un certain environnement à grande vitesse, il va obtenir un problème de mémoire?

et quelle est la bonne façon d'utiliser pcap_next/pcap_next_ex?

Répondre

-3

Il existe de nombreux exemples d'exemples de travail pcap en ligne et des pages de manuel utiles. Essayez ici: TCPDUMP.org Nous aurions besoin de plus de votre code pour répondre à vos questions.

+0

, je ne l'ai trouvé il y a un bogue dans 0,98 (mais il semble qu'il est pas une version officielle? Télécharger le formulaire http://public.lanl.gov/cpw/) le func 'pcap_next' ou 'pcap_next_ex' sont incorrects, il n'a pas copié le paquet dans un endroit sûr avant de retourner à l'application utilisateur. – jon

+0

Intéressant. Dans mon propre test avec pcap_next j'ai remarqué le même résultat que ma taille de fenêtre TCP rétrécit de plus en plus petit jusqu'à ce qu'il atteigne zéro. La fonction ne vidait pas le tampon de réception correctement et j'ai dû réécrire pour utiliser recv() au lieu des utilitaires pcap sympa. Je ne peux pas commenter sur ce patch spécifique, mais le passage à select()/recv() a fonctionné pour mon problème. – Shawn

1

Je ai gelé sur ce problème en python avec winpcapy (1.9.2009) et WinPcap 4.1.0.2001. Je l'ai résolu simplement en créant une copie du tableau de données par paquets (comme suggéré par memcpy mentionné dans la question).

pkt_data = pkt_data[:header.contents.len]

Je ne sais pas si elle est correcte, mais fonctionne pour moi en ce moment.

Et sur la base de la réponse à winpcap papermail, ce à quoi pkt_data fait référence devrait persister jusqu'à l'appel suivant de pcap_next_ex (ou d'une autre méthode de répartition). Si je l'ai bien fait, car il utilise un tampon pour plus/tous les paquets et donc il peut être réutilisé pour d'autres/derniers paquets?

Q.

-1
char errbuff[10000]; 
pcap_t * handler = pcap_open_offline(argv[1], errbuff); 
struct pcap_pkthdr *header; 
u_char *packet; 
while (pcap_next_ex(handler, &header, &packet) >= 0) 
{ 
    printf("len %d:\n",header->len); 
    ... YOUR CODE 


} 
bien