嗅探数据包时,我遇到了 scapy 的超时选项问题。据我了解,如果你使用这样的东西:
test = sniff(filter="ip and icmp ", timeout = 2)
print(test)
您的嗅探应该在 2 秒后超时。但是,这 100% 不起作用。根据我的收集,最大的问题之一是,如果您设置 timeout = 5 并运行嗅探器,然后在并行命令提示符下运行 ping google.com,它将捕获 4 个数据包,直到嗅探完成完成然后无限期地坐在那里,直到您再发送或接收 1 个 icmp 数据包,只有一个,然后它将杀死嗅探并打印(测试),第一个 ping 组中总共有 5 个 icmp 4,来自第二个 ping 组中的 1 个。
我正在使用Windows,这可能是我不知道的问题。我有python 2.7。我的整个脚本,为了测试这件事,必须将它与一个更大的脚本隔离开来:
from scapy.all import *
test = sniff(filter="ip and icmp ", timeout = 5)
print(test)
就是这样 - 如果 timeout = 1,它不会停止,直到收到一个数据包。
这是 scapy 的 sendrecv.py 用于嗅探超时的代码
if timeout is not None:
stoptime = time.time()+timeout
remain = None
while 1:
try:
if timeout is not None:
remain = stoptime-time.time()
if remain <= 0:
break
在从 scapy sendrecv.py 中提取函数并意识到该函数有同样的问题后,我缩小了问题的范围。当您将过滤器传递给嗅探函数时,它会改变超时的工作方式。如果你运行:
从 scapy.all 导入 *
test = sniff(timeout = 5)
print(test)
你会没事的,它会在 5 秒后自动超时,否则它会挂起并且无法正确完成超时循环。