2013-01-18 9 views
5

Beim Ausführen des folgenden Codes erreicht einer der CPU-Kerne 100%. Mit oder ohne Verkehr. Was ist falsch?100% CPU-Auslastung mit einem einfachen libpcap-Beispiel

Beispielcode:

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

kompilieren mit: gcc example.c -o example -lpcap

Lauf mit: ./example "tcp" oder dem Filter, den Sie mögen.

Wie Sie sehen können ist es das typische Beispiel ist die Haupt- und die Callback-Funktion für die Schleife: pcap_loop(descr, -1, my_callback, NULL);

Der Rückruf ist leer (nutzlose), aber es ist nur um zu zeigen, dass das Problem nicht in dem Rückruf .

Antwort

5

Sie angegebenen Timeout -1 hier:

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

Es stellt sich pcap_loop in einem langen Schleife, wie poll kontinuierlich mal sofort aus.

Verwenden Sie etwas wie 1000 (Millisekunden), wenn Sie keinen Grund für einen anderen Wert haben.

+0

gelöst! Danke Anton – TheBronx

Verwandte Themen