如果在start()之后立即调用stop(),则Scapy AsyncSniffer将失败



查看以下示例

a = AsyncSniffer()
a.start()
a.stop()

a.stop((将引发异常。有没有一种方法可以在start((和stop((之间不添加time.sleep((来解决这个问题?

  • 这当然是一个人为的例子,但如果我在start((和stop((之间创建一个测试存根,我们项目中的代码也会遇到同样的问题

更新:从pycharm运行tracebak:

FAILED                         [100%]
test_async_sniffer.py:3 (test_async_sniffer)
self = <scapy.sendrecv.AsyncSniffer object at 0x7f1d57a7f1f0>, join = True
    def stop(self, join=True):
        """Stops AsyncSniffer if not in async mode"""
        if self.running:
            try:
>               self.stop_cb()
E               AttributeError: 'AsyncSniffer' object has no attribute 'stop_cb'
venv/lib/python3.8/site-packages/scapy/sendrecv.py:1017: AttributeError
During handling of the above exception, another exception occurred:
    def test_async_sniffer():
        a = AsyncSniffer()
        a.start()
>       a.stop()
test_async_sniffer.py:7: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
self = <scapy.sendrecv.AsyncSniffer object at 0x7f1d57a7f1f0>, join = True
    def stop(self, join=True):
        """Stops AsyncSniffer if not in async mode"""
        if self.running:
            try:
                self.stop_cb()
            except AttributeError:
>               raise Scapy_Exception(
                    "Unsupported (offline or unsupported socket)"
                )
E               scapy.error.Scapy_Exception: Unsupported (offline or unsupported socket)
venv/lib/python3.8/site-packages/scapy/sendrecv.py:1019: Scapy_Exception

一个可能的答案,尽管并不漂亮:

    a = AsyncSniffer()
    a.start()
    if not hasattr(a, 'stop_cb'):
        time.sleep(0.06)
    a.stop()

似乎start()创建了属性stop_cb,如果stop()是在start()之后调用的,那么stop_cb还没有创建,所以我添加了一个带有睡眠的hasattr(测试显示0.06秒是足够的时间,但我想这是非常随意的(

最新更新