打开使用 pcapy 转储的 .pcap 时出现 Wireshark 错误

Wireshark error when opening .pcap dumped with pcapy

我正在使用以下 python 代码来捕获流量并将其转储到 .pcap 文件:

from pcapy import open_live

p = open_live("eth0", 65535, 1, 0)
dumper = p.dump_open("./test.pcap")
while capturing:
    (header, packet) = p.next()
    dumper.dump(header, packet)

我实际上是 运行 这在一个线程中,其中 capturing 是一个 threading.Event() 当我想停止捕获时设置为 False (所以它退出循环并 returns 干净利落地)。

但是,当我尝试使用 wireshark 打开 test.pcap 时,我收到以下消息:

The capture file appears to have been cut short in the middle of a packet.

我有时会看到 test.pcap 末尾缺少几个数据包(我可以调试它,因为我正在将拦截的数据包写入 .csv 文件)。但是,除此之外,我认为 pcap 文件很好。不过,这条消息有点烦人。我想我可能需要包含一些神奇的数字才能让 wireshark 相信这是一个 wireshark 捕获或类似的东西。我发现其他 questions 的人收到此消息是因为他们没有彻底关闭捕获(但正如我所说,我关闭了(或者我是否需要明确关闭由 pcapy 打开的文件描述符?我无法在 pcapy API 中找到关闭它的方法。此外,我没有使用 wireshark 进行捕获,所以这可能是一个不同的问题)。

有人知道这条消息是因为什么吗?或者,有人知道我该如何调试并找到导致 wireshark 弹出此消息的原因吗?

编辑

关闭dumper的Pcapy源码here.

I found other questions of people getting this message because they don't close the capture cleanly

没有完全关闭的是 dumper 的句柄。

or do I need to explicitly close the file descriptor open by pcapy?

您需要关闭 dumper

I couldn't find a method in the pcapy API that closes it

没有一个。通过快速查看 pcapy 源代码,它会在 dumper 发布时隐式关闭。如果您的 Python 程序干净地退出,那应该会发生。

如果它没有干净地退出(例如,如果它在没有它的情况下被 control-C 杀死,或者 Python 解释器捕获信号并干净地退出),您需要修复它。

如果它 干净退出,则可能是 pcapy 某处存在错误;将此作为错误报告给 pcapy 开发人员。

(pcap_dumper_ts 使用 "standard I/O library" C 例程,这意味着它们进行缓冲输出,并且数据不会在每次转储调用时立即写入文件;关闭转储程序会导致尚未写入要写出的文件的数据。这应该在 C 程序(即 Python 解释器 - 退出时完成,如果在此之前没有完成的话。)

pcapy 试图模仿 pcap 库的 API。不幸的是,它缺少一个重要的功能:pcap_dump_flush。默认情况下,pcap 缓冲区写入并且只有在缓冲区包含足够的数据或转储文件关闭时才会将缓冲区写入磁盘。使用 pcap_dump_flush on 可以触发缓冲区的刷新。由于此功能在 pcapy 中不可用,您唯一的选择是在从另一个应用程序读取文件之前关闭该文件。