c - 100% cpu 使用率和一个 libpcap 简单示例

标签 c linux network-programming libpcap

在运行下面的代码时,其中一个 CPU 核心的使用率达到 100%。有或没有流量。怎么了?

示例代码:

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

编译:gcc example.c -o example -lpcap

运行:./example "tcp" 或您喜欢的过滤器。

如您所见,这是典型示例,循环的主要函数和回调函数:pcap_loop(descr, -1, my_callback, NULL);

回调为空(无用),但它只是说明问题不在回调中。

最佳答案

您指定了超时 -1这里:

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

它变成了pcap_loop进入一个繁忙的循环,如poll连续立即超时。

使用像 1000 这样的东西(毫秒)如果您没有理由需要其他值。

关于c - 100% cpu 使用率和一个 libpcap 简单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14404299/

相关文章:

linux - 套接字缓冲区绑定(bind)到套接字

r - 如何计算 R 网络图中所有顶点的二次度?

c++ - CMake的package_find冲突如何解决?

C - 根据值移动或删除多个节点

c - 以用户身份安装 Clang(无根权限)?

python : How do server come to know of network failure at the client side?

c - 使用 C 算法按顺序打印数字

谁能解决我的错误

ruby - 微云代工-VCAP ROUTER : 404 - DESTINATION NOT FOUND?

java - Debian 3.16 上缺少 libswt-gtk-3349.so