我想使用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格式进行编写,尽管尚不清楚原因,但上述内容才能实现上述要求。
是否可以捕获多个接口并将它们写入同一文件?
答案 0 :(得分:0)
是否可以捕获多个接口并将它们写入同一文件?
是的,但是1)您必须仅一次 打开输出文件,并调用pcap_dump_open()
一个(否则,就像您的程序一样,可能有两个线程分别独立地写入同一个文件并且彼此步进)和2)您需要具有某种形式的互斥体以防止两个线程同时写入文件。
此外,您应该让一个线程仅从一个捕获设备读取,而另一个线程从另一捕获设备读取,而不要让两个线程都从两个设备读取。
答案 1 :(得分:0)
作为user9065877,您只需打开输出文件一次,一次只能从一个线程对其进行写入。
但是,由于您仍然要序列化所有内容,因此您可能更愿意使用单线程以循环方式为包请求interfaces和poll的libpcap可轮询文件描述符也没有互斥体。