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?
, 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
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