Как обработать время ожидания запроса в python — скрипт traceroute с использованием scapy

Я пытаюсь написать программу traceroute, используя Python и Scapy (с ICMP). У меня проблема в том, что иногда я не получаю ответа от пункта назначения, и моя программа просто зависает в ожидании ответа. (При использовании traceroute в cmd это эквивалентно ситуации «Время ожидания запроса истекло»). Я думаю, что функция sr1 ждет ответа, но так и не получает его. Как я могу это исправить?

Я также не уверен, что обработал случай, когда я добрался до места назначения, я проверил, равен ли тип 3, но я не уверен, что это правильно. Буду рад получить ответ и по этому поводу.

import sys
i, o, e = sys.stdin, sys.stdout, sys.stderr
from scapy.all import *
sys.stdin, sys.stdout, sys.stderr = i, o, e

def main():
    hostname = input("Enter the destination")
    done = False
    distance = 1
    while not done:
        tracert_packet = IP(dst=hostname, ttl=distance)/ICMP()
        # Send the packet and get a reply
        tracert_resopnse = sr1(tracert_packet, verbose=0)/ICMP()
        if tracert_resopnse.type == 3:
            # We've reached our destination
            print("Done!" + tracert_resopnse[IP].src)
            done = True
        else:
            # We haven't got to the destination yet
            print(str(distance) +" hops away: "+ str(tracert_resopnse.src))
            distance += 1

if __name__ == '__main__':
    main()

person Daniel Segal    schedule 26.08.2019    source источник


Ответы (1)


Используйте 1_. Если ответа нет, возвращаемое значение будет None, поэтому проверьте, прежде чем объединять с ICMP...

person Shir    schedule 28.08.2019