使用libpcap捕获到同一文件的多个接口

时间:2019-06-27 10:53:58

标签: libpcap

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

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

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格式进行编写,尽管尚不清楚原因,但上述内容才能实现上述要求。

是否可以捕获多个接口并将它们写入同一文件?

2 个答案:

答案 0 :(得分:0)

  

是否可以捕获多个接口并将它们写入同一文件?

是的,但是1)您必须仅一次 打开输出文件,并调用pcap_dump_open() 一个(否则,就像您的程序一样,可能有两个线程分别独立地写入同一个文件并且彼此步进)和2)您需要具有某种形式的互斥体以防止两个线程同时写入文件。

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

答案 1 :(得分:0)

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

但是,由于您仍然要序列化所有内容,因此您可能更愿意使用单线程以循环方式为包请求interfacespoll的libpcap可轮询文件描述符也没有互斥体。