2013-01-18 27 views
5

durante l'esecuzione del codice sottostante, uno dei core della CPU raggiunge il 100% di utilizzo. Con o senza traffico. Che c'è?Utilizzo della cpu al 100% con un semplice esempio di libpcap

codice Esempio:

#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; 
} 

compilare con: gcc example.c -o example -lpcap

run con: ./example "tcp" o il filtro che ti piace.

Come si può vedere che è il tipico esempio, la funzione di callback per il ciclo principale e: pcap_loop(descr, -1, my_callback, NULL);

La richiamata è vuota (inutile) ma è solo per dimostrare che il problema non è nella callback .

risposta

5

È stato specificato timeout -1 qui:

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

Si trasforma pcap_loop in un ciclo occupato, come poll continuamente volte fuori all'istante.

Utilizzare qualcosa come 1000 (millisecondi) se non si ha motivo di altri valori.

+0

risolto! grazie Anton – TheBronx