2013-01-18 15 views
5

przy uruchomionym poniższym kodzie, jeden z rdzeni procesora osiąga 100% użycia. Z ruchem lub bez. Co jest nie tak?100% użycie procesora z prostym przykładem libpcap

Przykładowy kod:

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

skompilować z: gcc example.c -o example -lpcap

metę z: ./example "tcp" lub filtrze chcesz.

Jak widać jest to typowy przykład, główną i funkcji wywołania zwrotnego dla pętli: pcap_loop(descr, -1, my_callback, NULL);

Wywołanie zwrotne jest pusta (bezużyteczny), ale to jest po prostu pokazać, że problem nie leży w zwrotnego .

Odpowiedz

5

Określono limit czasu -1 tutaj:

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

Okazuje pcap_loop na ruchliwej pętli, jak poll ciągły czasy się natychmiast.

Użyj czegoś podobnego do 1000 (milisekund), jeśli nie masz powodu dla innej wartości.

+0

rozwiązany! dziękuję Anton – TheBronx

Powiązane problemy