You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PyShark设置timeout后仍持续抓包的原因排查

Why does PyShark keep capturing packets after the timeout?

我来帮你揪出问题所在——你的代码里藏了个很容易踩的PyShark逻辑坑:你以为遍历capture是在处理之前10秒内抓到的包,但实际上LiveCapture对象本身是个实时抓包的迭代器,当你执行for pkt in capture时,它会重新启动持续抓包,完全不受之前sniff(timeout=10)的限制

问题根源拆解

capture.sniff(timeout=10)确实会在10秒内抓取数据包,并返回这一批包的列表,但它并不会让capture对象停止监听网卡的新数据包。当你后续写for pkt in capture时,这个循环会直接触发PyShark的实时抓包逻辑,持续捕获新的流量,这就是为什么超时后你还能看到不断输出数据包的原因。

修正后的代码

你需要把sniff()返回的已捕获数据包存到独立变量里,然后遍历这个变量,而不是直接遍历LiveCapture对象:

import time
import pyshark

prog_start = time.time()
capture = pyshark.LiveCapture(interface='en0')
# 把10秒内捕获的数据包存储到变量中,避免后续触发新抓包
captured_packets = capture.sniff(timeout=10)

if captured_packets:
    start_time = captured_packets[0].frame_info.time_epoch
    end_time = captured_packets[-1].frame_info.time_epoch
    print("Capture lasted:", float(end_time) - float(start_time))

pkt_num = 0
# 遍历已经捕获的数据包,不会产生新的抓包行为
for pkt in captured_packets:
    pkt_num += 1
    print("Time", time.time() - prog_start, "Pkt#", pkt_num)

额外补充

如果你的场景需要更灵活的超时控制,也可以用sniff_continuously()配合手动计时来停止抓包,但上面的方案是最直接解决你当前问题的方式。核心要记住两个关键行为:

  • LiveCapture.sniff(timeout=N):一次性抓取N秒内的数据包,返回已捕获的包列表
  • 直接遍历LiveCapture对象:会持续实时抓包,直到主动终止程序

内容的提问来源于stack exchange,提问作者Sajan Maharjan

火山引擎 最新活动