【问题标题】:Problems with libpcap - segmentation faultlibpcap 的问题 - 分段错误
【发布时间】:2019-12-02 11:17:25
【问题描述】:

我在使用 libpcap 函数“pcap_findalldevs”时遇到问题。 问题是当我运行代码时出现“分段错误”。 代码是:

int listDevices()
{
    int res = -1;
    int count = 1;
    pcap_if_t *device;
    pcap_if_t **alldev;
    char e_buffer[PCAP_ERRBUF_SIZE];

    res = pcap_findalldevs(alldev, e_buffer); //Gives "segmentation fault" here

    if (res == 0)
    {
        printf("Error reading list of devices: %s\n", e_buffer);
        return res;
    }

    if (alldev == NULL)
    {
        printf("No devices founded!");
        return 1;
    }

    device = *alldev;

    while(device != NULL)
    {       
        printf("%s\n", device->name);
        device= device->next;
    }

    pcap_freealldevs(*alldev);

    return 0;
}

观察变量,我可以看到 **alldev 给出的地址为 0x0,而其他地址则为“正常”地址。 我做错了什么?

提前谢谢你。

【问题讨论】:

    标签: visual-studio-code segmentation-fault libpcap


    【解决方案1】:

    res = pcap_findalldevs(alldev, e_buffer);

    你没有在这里给alldev一个值,所以它把一个随机值传递给pcap_findalldevs(),导致它崩溃。

    需要传递给pcap_findalldevs()的是一个指向pcap_if_t变量的指针,所以你应该这样做

    res = pcap_findalldevs(&device, e_buffer);
    

    如果该调用返回的值不是PCAP_ERROR,则device 将被设置为指向pcap_if_t 结构列表的第一个元素——如果没有找到接口,则设置为NULL。即,返回值 0 表示 成功,所以你应该这样做

    if (res == PCAP_ERROR)
    {
        printf("Error reading list of devices: %s\n", e_buffer);
        return res;
    }
    

    作为错误检查。

    你可以去掉alldev这个变量。

    【讨论】:

    • 抱歉重播晚了,但我不得不暂时停止这个项目。你的回答确实解决了问题。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多