【问题标题】:Wireshark error when opening .pcap dumped with pcapy打开使用 pcapy 转储的 .pcap 时出现 Wireshark 错误
【发布时间】:2015-04-11 16:32:15
【问题描述】:

我正在使用以下 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(因此它退出循环并干净地返回)。

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

捕获文件似乎在数据包的中间被剪短了。

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

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

编辑

关闭dumperhere的Pcapy源代码。

【问题讨论】:

    标签: python networking wireshark pcap libpcap


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。因此,将您的答案与@Guy Harris 结合起来,我关闭文件的第一枪是尝试通过执行del dumper 之类的操作来释放dumper?对吗?
    • dumper = None 也应该可以工作。这将释放该对象,从the code 来看,它将调用pcap_dump_close,这正是您所需要的。
    • 是的,这就够了。谢谢。
    • 是的——如果释放一个对象没有有用的副作用,那么自动垃圾回收可能就足够了,所以它何时完成并不重要。不幸的是,I/O 句柄对象并非如此。例如,如果缓冲区在对象被释放时被刷新,则将刷新推迟到垃圾收集释放对象时推迟写入文件。在这些情况下,可能需要明确的发布调用。
    • @GuyHarris:是的,如果以这种方式立即释放对象,那可能是幸运的。但是我不知道有什么更好的方法:我认为除了缺少刷新功能之外,仅在垃圾收集时关闭转储文件是一个设计错误。这种设计将适用于基于引用计数的 GC(如在 Perl 中),但不适用于在认为有意义时调用的 GC。
    【解决方案2】:

    我发现人们收到此消息的其他问题是因为他们没有完全关闭捕获

    没有完全关闭的是翻斗车的把手。

    还是需要显式关闭 pcapy 打开的文件描述符?

    你需要关闭dumper

    我在 pcapy API 中找不到关闭它的方法

    没有。快速浏览一下 pcapy 源代码,当dumper 被释放时它被隐式关闭。如果您的 Python 程序干净地退出,这应该会发生。

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

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

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

    【讨论】:

    • 感谢您的回答。我正在做几个捕获,所以我的程序在运行上面代码的线程运行后不​​会退出。当我将事件设置为 False 时,线程应该返回并且应该关闭转储程序,对吗?
    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 2017-10-22
    • 2020-03-27
    相关资源
    最近更新 更多