C++ pcap\u set\u rfmon不工作?

C++ pcap\u set\u rfmon不工作?,c++,pcap,libpcap,C++,Pcap,Libpcap,我正在尝试将我的设备设置为监视模式,我知道它能够处于监视模式,iwconfig wlan0模式监视器工作,我运行我的代码,我可以从任何地方捕获数据包 问题是,在libpcap中,在没有进入上述命令行的情况下,它根本无法将我的设备设置为监控模式。在手动连接到接入点之前,我无法捕获任何数据包 pcap_t *handler = pcap_create("wlan0",errbuff); if(pcap_set_rfmon(handler,1)==0 ) {

我正在尝试将我的设备设置为监视模式,我知道它能够处于监视模式,iwconfig wlan0模式监视器工作,我运行我的代码,我可以从任何地方捕获数据包

问题是,在libpcap中,在没有进入上述命令行的情况下,它根本无法将我的设备设置为监控模式。在手动连接到接入点之前,我无法捕获任何数据包

       pcap_t *handler = pcap_create("wlan0",errbuff);
       if(pcap_set_rfmon(handler,1)==0 )
       {
           std::cout << "monitor mode enabled" << std::endl;
       }
       handler=pcap_open_live ("wlan0", 2048,0,512,errbuff);
       int status = pcap_activate(handler); //it returns 0 here.

那么这是一个代码问题,还是pcap库问题?有人在不使用命令行的情况下成功地将设备设置为监视模式吗?我使用的是Realtek2500顺便说一句。

您不应该在同一代码中使用pcap\u open\u live和pcap\u create/pcap\u activate。试着做

pcap_t *handler = pcap_create("wlan0",errbuff);
if (handler == NULL)
{
    std::cerr << "pcap_create failed: " << errbuf << std::endl;
    return; // or exit or return an error code or something
}
if(pcap_set_rfmon(handler,1)==0 )
{
    std::cout << "monitor mode enabled" << std::endl;
}
pcap_set_snaplen(handler, 2048);  // Set the snapshot length to 2048
pcap_set_promisc(handler, 0); // Turn promiscuous mode off
pcap_set_timeout(handler, 512); // Set the timeout to 512 milliseconds
int status = pcap_activate(handler);

当然,还要检查status的值。

您不应该在同一代码中使用pcap\u open\u live和pcap\u create/pcap\u activate。试着做

pcap_t *handler = pcap_create("wlan0",errbuff);
if (handler == NULL)
{
    std::cerr << "pcap_create failed: " << errbuf << std::endl;
    return; // or exit or return an error code or something
}
if(pcap_set_rfmon(handler,1)==0 )
{
    std::cout << "monitor mode enabled" << std::endl;
}
pcap_set_snaplen(handler, 2048);  // Set the snapshot length to 2048
pcap_set_promisc(handler, 0); // Turn promiscuous mode off
pcap_set_timeout(handler, 512); // Set the timeout to 512 milliseconds
int status = pcap_activate(handler);

当然,还要检查status的值。

加上盖伊·哈里斯的答案。 使用pcap_open_live打开设备将使其处于激活状态。当您继续调用PCAP\u set\u rfmon时,您将激活PCAP\u ERROR\u-4


因此,使用pcap_create打开句柄,设置rfmon,然后调用pcap_activate来激活它。

除了盖伊·哈里斯的答案之外。 使用pcap_open_live打开设备将使其处于激活状态。当您继续调用PCAP\u set\u rfmon时,您将激活PCAP\u ERROR\u-4


因此,请使用pcap_create打开句柄,并设置rfmon,然后调用pcap_activate将其激活。

注意:pcap_set_rfmon成功后返回0。。。 所以这个代码是正确的:

   pcap_t *handler = pcap_create("wlan0",errbuff);
   **if(pcap_set_rfmon(handler,1) )**
   {
       std::cout << "monitor mode enabled" << std::endl;
   }

警告:pcap\u set\u rfmon成功返回0。。。 所以这个代码是正确的:

   pcap_t *handler = pcap_create("wlan0",errbuff);
   **if(pcap_set_rfmon(handler,1) )**
   {
       std::cout << "monitor mode enabled" << std::endl;
   }

这是因为,在回答这个问题时,我在pcap_open_live中添加了一个check,以便在这种情况下失败;当最初的海报问这个问题时,没有进行检查。这是因为,在回答这个问题时,我在pcap_open_live中添加了一个检查,以在这种情况下失败;当最初的海报问这个问题时,没有进行检查。