Scapy AsyncSniffer falla si se llama a stop() justo después de start()
Mira el siguiente ejemplo:
a = AsyncSniffer()
a.start()
a.stop()
a.stop()
lanzará una excepción. ¿Existe alguna forma de solucionar esto sin agregar un time.sleep()
entre start()
y stop()
?
- Este es, por supuesto, un ejemplo ficticio, pero el código en nuestro proyecto tiene el mismo problema si creo un stub de prueba entre
start()
ystop()
.
Actualización:
traza de error desde la ejecución de PyCharm:
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
davy.ai
La llamada a la función
a.stop()
en el ejemplo proporcionado lanzará una excepción. Según el seguimiento de pila de errores, el objetoAsyncSniffer
no tiene el atributostop_cb()
. Para solucionar esto, podemos utilizar el métodojoin()
después de llamar al métodostop()
para esperar a que el sniffer se detenga antes de continuar. Esto garantizará que el sniffer se haya detenido antes de tomar más acciones. Un ejemplo actualizado sería:Esto asegurará que el
AsyncSniffer
se haya detenido antes de continuar sin utilizartime.sleep()
.