pcap_set_rfmon return 0 为成功但接口未设置为监控模式

pcap_set_rfmon return 0 as success but the interface is not set to monitor mode

我正在尝试编写一个小程序,使用 C 将我的网络接口设置为 monitor mode,函数 pcap_set_rfmon returns 0 成功但接口仍处于管理模式。我确定我的网卡支持监控模式,因为我已经使用 ng-airmoniwconfig wlp3s0 mode monitor 检查过 wlp3s0 是我的网络接口的名称。

这是我的代码:

#include <pcap.h>
main()
{
    char error_buffer[PCAP_ERRBUF_SIZE];
    pcap_t *handle = pcap_create("wlp3s0", error_buffer);
    int result = pcap_set_rfmon(handle, 1);
    if (result != 0)
    {
        printf("failed to set pcap rfmon");
    }
}

因为代码没有输出任何东西,只有 returns 0,我不知道出了什么问题,也不知道该看哪里,你们能告诉我我应该检查什么或者缺少什么吗

引用 pcap_set_rfmon() 的文档:

pcap_set_rfmon() sets whether monitor mode should be set on a capture handle when the handle is activated. ...

我已经强调了其中的一部分——“当手柄被激活时”。 pcap_set_rfmon() 所做的只是在 pcap_t 中设置一个标志,以指示 当程序调用 pcap_activate() 时,适配器将进入监控模式(如果 pcap_activate() 成功)。

你没有打电话给 pcap_activate(),所以没有任何反应。

您还必须保持 pcap_t 打开 - 即使是

#include <pcap.h>
main()
{
    char error_buffer[PCAP_ERRBUF_SIZE];
    pcap_t *handle;
    int result;

    handle = pcap_create("wlp3s0", error_buffer);
    if (handle == NULL)
    {
        printf("failed to create a handle: %s\n",
               error_buffer);
        return 2;
    }
    result = pcap_set_rfmon(handle, 1);
    if (result != 0)
    {
        printf("failed to set pcap rfmon: %s (%s)\n",
               pcap_statustostr(result),
               pcap_geterr(handle));
        return 2;
    }
    result = pcap_activate(handle);
    {
        printf("failed to activate handle: %s (%s)\n",
               pcap_statustostr(result),
               pcap_geterr(handle));
        return 2;
    }
}

只会让适配器在退出时恢复到托管模式。您需要添加诸如

之类的内容
    for (;;)
        pause();

main() 的末尾,因此程序不会退出,除非您中断或终止它。

(注意:我在程序中添加了更多的错误检查和报告。这是一件好事,因为这意味着,如果某事不起作用,程序将给出详细的错误报告,帮助您 - 或者无论你向谁寻求帮助 - 尝试解决问题,而不是默默地失败,或者如果 pcap_create() 失败,崩溃。)