|  | 
| 1 | 1 | # -*- coding: utf-8 - *- | 
| 2 |  | -import os | 
| 3 |  | -import sys | 
| 4 | 2 | import socket | 
| 5 | 3 | import struct | 
| 6 |  | -import select | 
| 7 |  | -import time | 
| 8 |  | -import errno | 
|  | 4 | +import sys | 
|  | 5 | +# import io | 
|  | 6 | + | 
|  | 7 | + | 
|  | 8 | +def trace(dest): | 
|  | 9 | + dest_addr = socket.gethostbyname(dest) | 
|  | 10 | + port = 23144 | 
|  | 11 | + max_jump = 30 | 
|  | 12 | + icmp = socket.getprotobyname('icmp') | 
|  | 13 | + udp = socket.getprotobyname('udp') | 
|  | 14 | + ttl = 1 | 
|  | 15 | + while True: | 
|  | 16 | + recv_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp) | 
|  | 17 | + send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp) | 
|  | 18 | + send_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl) | 
|  | 19 | + | 
|  | 20 | + timeout = struct.pack("ll", 5, 0) | 
|  | 21 | + | 
|  | 22 | + recv_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, timeout) | 
|  | 23 | + recv_socket.bind(("", port)) | 
|  | 24 | + print(" %d " % (ttl), end='') | 
|  | 25 | + send_socket.sendto(bytes("", "utf-8"), (dest, port)) | 
|  | 26 | + curr_addr = None | 
|  | 27 | + curr_name = None | 
|  | 28 | + finished = False | 
|  | 29 | + attemp = 3 | 
|  | 30 | + | 
|  | 31 | + while not finished and attemp > 0: | 
|  | 32 | + try: | 
|  | 33 | + _, curr_addr = recv_socket.recvfrom(512) | 
|  | 34 | + finished = True | 
|  | 35 | + curr_addr = curr_addr[0] | 
|  | 36 | + try: | 
|  | 37 | + curr_name = socket.gethostbyaddr(curr_addr)[0] | 
|  | 38 | + except socket.error: | 
|  | 39 | + curr_name = curr_addr | 
|  | 40 | + except socket.error as error: | 
|  | 41 | + attemp -= 1 | 
|  | 42 | + print("* ", end='') | 
|  | 43 | + | 
|  | 44 | + send_socket.close() | 
|  | 45 | + recv_socket.close() | 
|  | 46 | + | 
|  | 47 | + if not finished: | 
|  | 48 | + pass | 
|  | 49 | + | 
|  | 50 | + if curr_addr is not None: | 
|  | 51 | + curr_host = "%s (%s)" % (curr_name, curr_addr) | 
|  | 52 | + else: | 
|  | 53 | + curr_host = "" | 
|  | 54 | + | 
|  | 55 | + print("%s" % (curr_host)) | 
|  | 56 | + # sys.stdout.write("%s\n" % (curr_host)) | 
|  | 57 | + | 
|  | 58 | + ttl += 1 | 
|  | 59 | + if curr_addr == dest_addr or ttl > max_jump: | 
|  | 60 | + break | 
|  | 61 | + | 
| 9 | 62 | 
 | 
|  | 63 | +if __name__ == "__main__": | 
|  | 64 | + dest = sys.argv[1] | 
|  | 65 | + trace(dest) | 
0 commit comments