2013-01-18 5 views
5

Lors de l'exécution du code ci-dessous, l'un des cœurs du processeur atteint 100% d'utilisation. Avec ou sans trafic. Qu'est-ce qui ne va pas?100% utilisation du processeur avec un exemple simple libpcap

code Exemple:

#include <stdio.h> 
#include <stdlib.h> 
#include <pcap.h> 
#include <errno.h> 

void my_callback(u_char *args, const struct pcap_pkthdr* pkthdr, const u_char* 
packet) 
{ 
    //nothing, nothing at all... 
    //printf("+"); 
} 

int main(int argc,char **argv) 
{ 
    int i; 
    char *dev; 
    char errbuf[PCAP_ERRBUF_SIZE]; 
    pcap_t* descr; 
    const u_char *packet; 
    struct bpf_program fp;  /* hold compiled program */ 
    bpf_u_int32 maskp;   /* subnet mask */ 
    bpf_u_int32 netp;    /* ip */ 

    if(argc != 2){ 
     fprintf(stdout, "Usage: %s \"expression\"\n" 
      ,argv[0]); 
     return 0; 
    } 

    /* Now get a device */ 
    dev = pcap_lookupdev(errbuf); 

    if(dev == NULL) { 
     fprintf(stderr, "%s\n", errbuf); 
     exit(1); 
    } 
    /* Get the network address and mask */ 
    pcap_lookupnet(dev, &netp, &maskp, errbuf); 
    /* open device for reading in promiscuous mode */ 
    descr = pcap_open_live(dev, BUFSIZ, 1,-1, errbuf); 
    if(descr == NULL) { 
     printf("pcap_open_live(): %s\n", errbuf); 
     exit(1); 
    } 

    /* Now we'll compile the filter expression*/ 
    if(pcap_compile(descr, &fp, argv[1], 0, netp) == -1) { 
     fprintf(stderr, "Error calling pcap_compile\n"); 
     exit(1); 
    } 

    /* set the filter */ 
    if(pcap_setfilter(descr, &fp) == -1) { 
     fprintf(stderr, "Error setting filter\n"); 
     exit(1); 
    } 

    /* loop for callback function */ 
    pcap_loop(descr, -1, my_callback, NULL); 
    return 0; 
} 

compilez avec: gcc example.c -o example -lpcap

course avec: ./example "tcp" ou le filtre que vous aimez.

Comme vous pouvez le voir, il est l'exemple typique, la principale et la fonction de rappel pour la boucle: pcap_loop(descr, -1, my_callback, NULL);

Le rappel est vide (inutile), mais il est juste de montrer que le problème n'est pas dans le rappel .

Répondre

5

Vous avez spécifié délai -1 ici:

descr = pcap_open_live(dev, BUFSIZ, 1,-1, errbuf); 

Il se pcap_loop dans une boucle d'attente, comme poll continuellement fois instantanément.

Utilisez quelque chose comme 1000 (millisecondes) si vous n'avez aucune autre valeur.

+0

résolu! merci Anton – TheBronx

Questions connexes