我有一个功能,可以使用libpCap在MacOS上为WiFi设备启用监控模式.这是可行的,但目前将WiFi设备设置回托管模式的唯一方法是退出该进程.我希望将WiFi设备设置为托管模式,同时允许该过程继续.据我所知,这不能用libpcap.我如何将WiFi设备设置回托管模式(可能使用Objective-C中的CoreWLAN API?)?

pcap_t *enable_monitor(char *dev) {
    wifi_disassociate();

    char error_buffer[PCAP_ERRBUF_SIZE];
    pcap_t *handle;
    int result;

    handle = pcap_create(dev, error_buffer);
    if (handle == NULL) {
        printf("failed to create a handle: %s\n",
               error_buffer);
        return NULL;
    }
    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 NULL;
    }
    result = pcap_activate(handle);
    if (result != 0) {
        printf("failed to activate handle: %s (%s)\n",
               pcap_statustostr(result),
               pcap_geterr(handle));
        return NULL;
    }
    //pcap_close(handle);
    return handle;
}

编辑: 将第二个参数设置为cap_set_rfmon到0似乎并没有将设备设置为托管模式,只是没有将其设置为监视模式.

int disable_monitor(pcap_t *handle) {
    int result;
    result = pcap_set_rfmon(handle, 0);
    if (result != 0) {
        printf("failed to set pcap rfmon: %s (%s)\n",
               pcap_statustostr(result),
               pcap_geterr(handle));
        return 1;
    }
    pcap_close(handle);
    return 0;
}

int main() {
    char *dev = find_wifi_device();
    pcap_t *handle = enable_monitor(dev);
    sleep(5);
    int status = disable_monitor(handle);
    printf("Status: %d\n", status);
    for (;;)
        sleep(100);
}

这将导致:

failed to set pcap rfmon: The setting can't be changed after the pcap_t is activated (can't perform  operation on activated capture)
Status: 1

推荐答案

以我最热门的 comments 为序.

man pcap_set_rfmon开始,它设置模式.但是,它只在"激活"时才生效(即pcap_activate).

此外,如果在already激活的句柄上调用,则调用将返回PCAP_ERROR_ACTIVATED错误.

我看了libpcap个源代码,然后...

一旦连接被激活,我可以找到no pcap_*呼叫,这将"停用"它.因此,我们可能不得不关闭句柄并打开一个新的实例.

此外,AFAICT,DO pcap_set_rfmon设置为0将清除标志(例如pcap->opt.rfmon).但是,对于新实例(即before调用pcap_activate),这一点应该已经很清楚了,因此这是一个有效的无操作.

从第一个pcap_activate呼叫开始,interface已经处于给定模式.通常,如果我们调用pcap_close,它不会"重置"(Note:对于some个接口,接口will被标记为在pcap_close上重置,但通常我们可能不能依赖这一点).

默认模式是什么?我猜是混杂模式,所以要重置监视器模式,我们可能不得不使用pcap_set_promisc.

这招奏效了谢谢pcap_set_promisc没有第二个pcap_set_rfmon.– 本杰明·米克勒

C++相关问答推荐

如何避免使用相对路径包含在c中

为什么在C中进行大量的位移位?

GCC引发不明确的诊断消息

C语言中的strstr问题

在 struct 中强制转换空指针

为什么我不能只在内存地址中添加一个int来寻址任何数组?

函数内的局部字符指针

在C++中访问双指针

获取每个循环迭代结束时的当前时间

CC2538裸机项目编译但不起作用

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

如何在C-函数中混合使用C代码和ASM?

这个空指针类型的转换是有效代码还是恶意代码?

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

如何编写postgresql支持函数

分支预测和UB(未定义的行为)

WSASocket在哪里定义?

C 语言中 CORDIC 对数的问题

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

c 函数指针,另一种语法