У меня проблема с параметром тайм-аута scapy при прослушивании пакетов. Насколько я понимаю, если вы используете что-то вроде этого:
test = sniff(filter="ip and icmp ", timeout = 2)
print(test)
ваше обнюхивание должно прекратиться через 2 секунды. Однако это на 100% не работает. Из того, что я понял, одна из самых больших проблем заключается в том, что если вы установите timeout = 5 и запустите сниффер, а затем запустите ping google.com в параллельной командной строке, он захватит 4 пакета , которые не отображаются пока обнюхивание не будет выполнено, затем сидите там бесконечно, пока вы не отправите или не получите еще 1 пакет icmp, только один, затем он убьет снифф и напечатает (тест) с 5 всего icmp 4 из первого набора ping , 1 со второго пинга.
Я использую окна, возможно, я не знаю об этом. У меня питон 2.7. Весь мой сценарий, для тестирования этой 1 вещи, пришлось изолировать ее от гораздо более крупного сценария, выглядит так:
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 import *
test = sniff(timeout = 5)
print(test)
все будет в порядке, тайм-аут будет автоматически равен 5 секундам, иначе он зависнет и не завершит цикл тайм-аута должным образом.