【问题标题】:How do I make libpcap/pcap_loop non-blocking?如何使 libpcap/pcap_loop 非阻塞?
【发布时间】:2015-07-08 23:40:51
【问题描述】:

我目前正在使用 libpcap 在混杂模式下嗅探流量

int main() 
{
    // some stuff
    printf("Opening device: %s\n", devname.c_str());

    handle = pcap_open_live(devname.c_str(), 65536 , 1 , 0 , errbuf);

    if (handle == NULL)
    {
        fprintf(stderr, "Couldn't open device %s : %s..." , devname.c_str(), errbuf);
        return 1;
    }
    printf(" Done\n");

    pcap_loop(handle , -1 , process_packet , NULL);
    // here run a thread to do some stuff. however, pcap_loop is blocking
    return 0;
}

我想添加一个外部线程来做一些其他的事情。如何更改上面的代码以使其成为非阻塞?

【问题讨论】:

  • 在调用 pcap_loop 之前启动线程?
  • 我可以试试,但是如果我想在 pcap_loop 之后做一些其他的事情呢?

标签: c++ linux multithreading libpcap packet-sniffers


【解决方案1】:

当您在 libpcap 上使用非阻塞模式时,您必须使用 pcap_dispatch,但请注意,pcap_dispatch 可以在阻塞模式或非阻塞模式下工作,这取决于您如何设置 libpcap,将 libpcap 设置为在非阻塞模式下工作阻止你使用函数pcap_setnonblock:

int pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf);

阻塞和非阻塞的区别不是永远运行的循环,而是阻塞函数pcap_dispatch等待一个数据包,只有在收到这个数据包时才返回,然而,在非阻塞模式下,函数立即返回,回调必须处理数据包。

在“非阻塞”模式下,尝试从捕获中读取 如果当前没有数据包,带有 pcap_dispatch() 的描述符将 可读取,立即返回 0 而不是阻塞 等待数据包到达。 pcap_loop() 和 pcap_next() 不会 在“非阻塞”模式下工作。

http://www.tcpdump.org/manpages/pcap_setnonblock.3pcap.html

【讨论】:

    【解决方案2】:

    pcap_loop 意味着一直持续到所有输入结束。如果您不希望这种行为,请改为在循环中调用 pcap_dispatch。根据定义 pcap_loop 永远不会返回,它意味着总是搜索更多的数据。

    【讨论】:

    • 谢谢。现在我在 pcap_loop 之前运行线程。它似乎正在工作。
    【解决方案3】:

    我使用pcap_next_ex 它返回一个结果,表明是否读取了数据包。通过这种方式,我管理我自己的线程的采集。请参阅示例herepcap_open 中的read_timeout 也会影响此功能。

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多