4

嗅探数据包时,我遇到了 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 秒后自动超时,否则它会挂起并且无法正确完成超时循环。

4

1 回答 1

0

我已经尝试过完全相同的代码,它对我来说非常有效。尝试重新安装 scapy,或恢复到旧版本。我发现对我来说 2.2.0dev 是更稳定的版本之一。

于 2016-06-18T09:31:28.890 回答