【问题标题】:Use libpcap to capture multiple interfaces to same file使用 libpcap 将多个接口捕获到同一个文件
【发布时间】:2019-06-27 10:53:58
【问题描述】:

我想使用 libpcap 在多个特定接口(不是“任何”)上捕获同一个文件

我有以下代码(错误处理和一些参数被删除):

static gpointer pkt_tracing_thread(gpointer data)
{
    while (1)
    {
        pcap_dispatch(g_capture_device1, .., dump_file1);
        pcap_dispatch(g_capture_device2, .., dump_file2);
    }
}

fp1 = calloc(1, sizeof(struct bpf_program));
fp2 = calloc(1, sizeof(struct bpf_program));
cap_dev1 = pcap_open_live(interface1,...
cap_dev2 = pcap_open_live(interface2,...
pcap_compile(cap_dev1, fp1, ...
pcap_compile(cap_dev2, fp2, ...
pcap_setfilter(cap_dev1, fp1);
pcap_setfilter(cap_dev2, fp2);
dump_file1 = pcap_dump_open(g_capture_device1, filename);
dump_file2 = pcap_dump_open(g_capture_device2, filename);

g_thread_create_full(pkt_tracing_thread, (gpointer)fp1, ...
g_thread_create_full(pkt_tracing_thread, (gpointer)fp2, ...

这不起作用。我在文件名中看到的只是其中一个接口上的数据包。我猜上面的代码中可能存在线程问题。

我已经阅读了https://seclists.org/tcpdump/2012/q2/18,但我仍然不清楚。

我读到 libpcap 不支持以 pcapng 格式写入,这是上述工作所必需的,尽管我不清楚为什么。

有什么方法可以捕获多个接口并将它们写入同一个文件?

【问题讨论】:

    标签: libpcap


    【解决方案1】:

    有什么方法可以捕获多个接口并将它们写入同一个文件?

    是的,但是 1) 您只需要打开输出文件一次one 调用pcap_dump_open()(否则,与您的程序一样,您可能有两个线程独立写入同一个文件并相互踩踏)和2)你需要有某种形式的互斥锁来防止两个线程同时写入文件。

    此外,您应该让一个线程仅从一个捕获设备读取数据,而另一个线程从另一个捕获设备读取数据,而不是让两个线程都从两个设备读取数据。

    【讨论】:

      【解决方案2】:

      作为 user9065877,您只需打开输出文件一次,一次只能从一个线程写入。

      但是,由于无论如何您都将序列化所有内容,您可能更愿意向 libpcap 询问 interfacespoll 的可轮询文件描述符,以循环方式处理数据包,使用单线程且不使用互斥锁。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-24
        • 1970-01-01
        相关资源
        最近更新 更多