2011-02-03 3 views
3

У меня есть программа Traceroute Python для системы Unix, которая выводит путь, который пакеты берут, чтобы получить от локального компьютера до места назначения - то есть последовательность маршрутизаторов, через которые проходят пакеты , Проблема в том, что я получаю вывод, который отображает:Нужна помощь по устранению неполадок traceroute в Unix

traceroute to yahoo.co.in (68.180.206.184), 30 hops max, 60 byte packets 

1 * * * 
2 * * * 
3 * * * 
4 * * * 
5 * * * 
6 * * * 
7 * * * 
8 * * * 
9 * * * 
. 
. 
. 
30 * * * 

У меня есть DSL-соединение. Программа отлично работает с командной строкой Windows (cmd.exe). Какова конкретная причина вышеназванного вывода?

код выглядит следующим образом:

#!/usr/bin/python 
import socket 
def main(dest_name): 
    dest_addr = socket.gethostbyname(dest_name) 
    port = 33434 
    max_hops = 30 
    icmp = socket.getprotobyname('icmp') 
    udp = socket.getprotobyname('udp') 
    ttl = 1 
    while True: 
     recv_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp) 
     send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp) 
     send_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl) 
     recv_socket.bind(("", port)) 
     send_socket.sendto("", (dest_name, port)) 
     curr_addr = None 
     curr_name = None 
     try: 
      _, curr_addr = recv_socket.recvfrom(512) 
      curr_addr = curr_addr[0] 
      try: 
       curr_name = socket.gethostbyaddr(curr_addr)[0] 
      except socket.error: 
       curr_name = curr_addr 
     except socket.error: 
      pass 
     finally: 
      send_socket.close() 
      recv_socket.close() 
     if curr_addr is not None: 
      curr_host = "%s (%s)" % (curr_name, curr_addr) 
     else: 
      curr_host = "*" 
     print "%d\t%s" % (ttl, curr_host) 
     ttl += 1 
     if curr_addr == dest_addr or ttl > max_hops: 
      break 
if __name__ == "__main__": 
    main('yahoo.co.in')** 
+0

Вы должны прочитать над [это] (http://stackoverflow.com/editing-help). –

+1

Это работает для меня. Вы запустили его как root? Используется дистрибутив Linux? –

+0

Что вы подразумеваете под «программа отлично работает с windows cmd»? Эта же программа Python? Команда Windows 'tracert'? Если программа Python работает в Windows XP, но не в Linux, это, вероятно, потому, что вам нужно быть root, чтобы открыть сырой сокет в Linux. –

ответ

2

трассировку маршрута/TRACERT действовать по-другому на Linux и Windows.

Linux отправит UDP-пакет с уменьшением TTL и прослушивает ответы ICMP. Windows отправляет эхо-запросы ICMP и прослушивает ответы ICMP.

Версия Python не работает, поскольку блоки UDP блокируются.

On Unix-like operating systems, the traceroute utility by default uses User Datagram Protocol (UDP) datagrams with destination port numbers from 33434 to 33534. The traceroute utility usually has an option to specify use of ICMP echo request (type 8) instead, as used by the Windows tracert utility.

http://en.wikipedia.org/wiki/Traceroute

 Смежные вопросы

  • Нет связанных вопросов^_^