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

时间:2015-04-11 16:32:16

标签: python networking wireshark pcap libpcap

我使用以下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)

我实际上是在一个帖子中运行它,capturingthreading.Event(),当我想要停止捕获时它被设置为False(所以它退出循环并且干净地回来。)

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

  

捕获文件似乎在数据包中间缩短了。

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

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

修改

关闭dumper here的Pcapy源代码。

2 个答案:

答案 0 :(得分:1)

  

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

dumper 的句柄是干净利落的。

  

或者我是否需要显式关闭pcapy打开的文件描述符?

您需要关闭dumper

  

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

没有一个。通过快速查看pcapy源代码,当dumper被释放时,它会被隐式关闭。如果您的Python程序干净利落,那应该会发生。

如果它没有干净地退出(例如,如果没有它被控制-C杀死,或者Python解释器,捕获信号并干净地退出),你需要解决这个问题。

如果 干净地退出,那么pcapy中可能存在某个错误;向pcapy开发人员报告这是一个错误。

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

答案 1 :(得分:1)

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