2011-02-03 11 views
3

私は、パケットがローカルマシンから宛先に到達するためにパケットが取るパスを出力するUnixシステム用のtraceroute Pythonプログラムを持っています。つまり、パケットが通過するルータのシーケンス。問題は、表示される出力を得ることです:UNIXでtracerouteのトラブルシューティングの助けが必要

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)でうまく動作します。上記の出力の正確な理由は何ですか? LinuxとWindowsで異なる

#!/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では動作しない場合は、おそらくLinux上でrawソケットを開くためにrootでなければならないからでしょう。 –

答えて

2

のtraceroute/tracertの行為:

のコードは次のようになります。

Linuxは、TTLが減少するUDPパケットを送信し、ICMP応答を待ち受けます。 WindowsはICMPエコー要求を送信し、ICMP応答をリッスンします。

UDPパケットがブロックされているため、Pythonバージョンが異常終了しています。

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