【问题标题】:Count the number of packets with pyshark用pyshark统计数据包的数量
【发布时间】:2014-11-19 19:56:30
【问题描述】:

在这段代码中使用 pyshark

import pyshark
cap = pyshark.FileCapture(filename)
i = 0
for idx, packet in enumerate(cap):
    i += 1
print i
print len(cap._packets)

ilen(cap._packets) 给出两个不同的结果。这是为什么呢?

【问题讨论】:

    标签: python wireshark packet-sniffers wireshark-dissector pyshark


    【解决方案1】:

    不知道它是否适用于 Python 2.7,但在 Python 3.4 中 len(cap) 返回 0。 FileCapture 对象是一个生成器,所以对我有用的是len([packet for packet in cap])

    【讨论】:

    • 为什么我得到`raise RuntimeError('This event loop is already running') RuntimeError: This event loop is already running` when running len([packet for packet in cap])?
    【解决方案2】:

    我也是,len(cap) 为 0,我认为答案是失败。 如果您想知道 len(cap),请在打印前加载数据包。 使用:cap.load_packets()

    cap.load_packets()
    packet_amount = len(cap)
    print packet_amount
    

    【讨论】:

      【解决方案3】:

      查看source code 会发现_packets 是一个包含数据包的列表,并且仅在内部使用:

      当使用keep_packets = True 遍历FileCapture 对象时,数据包将被添加到此列表中。


      要访问FileCapture 对象中的所有数据包,您应该像以前一样对其进行迭代:

      for packet in cap:
          do_something(packet)
      

      但是要计算数据包的数量,只需这样做:

      packet_amount = len(cap)
      

      或像您一样使用计数器,但不要使用 _packets,因为它不包含完整的数据包列表。

      【讨论】:

        【解决方案4】:

        只是添加了另一种使用回调函数的方式。也有点快的方法。

        length = 0 
        def count_callback(pkt):
            global length
            length = length + 1
        
        cap.apply_on_packets(count_callback)
        
        print(length)
        

        【讨论】:

          猜你喜欢
          • 2020-02-10
          • 2015-07-20
          • 1970-01-01
          • 2020-05-25
          • 1970-01-01
          • 1970-01-01
          • 2012-05-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多