【问题标题】:Scapy PcapReader Memory errorScapy PcapReader 内存错误
【发布时间】:2014-11-08 08:55:11
【问题描述】:

scapy 的 PcapReader 有问题,当读取许多数据包时会导致 MemoryError(没有描述)。

我通过扩展 PcapReader 创建了自己的阅读器,我重写了 scapy 的 read_all 方法,因此它返回 generator 而不是将其全部加载到列表中。

class MyPcapReader(PcapReader):

    def __init__(self, filename):
        PcapReader.__init__(self, filename)


    def read_all(self,count=-1):
        """return an iterable of all packets in the pcap file
        """
        while count != 0:
            count -= 1
            p = self.read_packet()
            if p is None:
                break

            yield p

这是我检索数据的方式

reader = MyPcapReader(fname).read_all()

for p in reader:

    processSingle(p)

问题可能出在哪里?当我切换回使用列表的实现时,read_all 中会引发异常。使用生成器,它会在 for 循环中引发。所以问题出在循环迭代中,但我不明白,生成器的问题在哪里。

【问题讨论】:

  • 您正在阅读的 PCAP 有多大?

标签: python python-2.7 memory pcap scapy


【解决方案1】:

你重新定义了 read_all()。我认为你不应该这样做

【讨论】:

  • 好吧,PcapReader 的实现会导致同样的错误。我不想在源文件中重写它的实现,我认为类的继承应该没有问题
  • 你能像wireshark一样正常运行吗?
  • 好的,文件似乎已损坏。无论如何,得到“MemoryError”是非常令人困惑的。
【解决方案2】:

.read_all() 方法的目的正是:一次读取所有数据包并将它们返回到一个列表中(技术上是一个PacketList 实例,但这对内存使用有相同的影响)。如果您的 PCAP 文件太大,您似乎会得到一个 MemoryError,这对我来说听起来不错。

如果你不想要一个列表而是一个生成器(这确实是一个不错的选择,尤其是在处理巨大的 PCAP 文件时),你可以直接迭代 PcapReader() 对象,不需要创建你自己的子类:

for p in PcapReader(fname):
    processSingle(p)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多