Guest User

Untitled

a guest
Jan 19th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.55 KB | None | 0 0
  1. require 'timeout'
  2. require 'socket'
  3. include Socket::Constants
  4.  
  5. def traceroute(destination)
  6. begin
  7. dest_address = IPSocket.getaddress(destination)
  8. rescue Exception => e
  9. puts "Can not resolve #{dest}"
  10. puts e.message
  11. return
  12. end
  13.  
  14. port = 33434
  15. ttl = 1
  16. max_hops = 30
  17.  
  18. while true
  19. recv_socket = Socket.new(Socket::AF_INET, Socket::SOCK_RAW, Socket::IPPROTO_ICMP)
  20. recv_socket.bind(Socket.pack_sockaddr_in(port, ""))
  21.  
  22. send_socket = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, Socket::IPPROTO_UDP)
  23. send_socket.setsockopt(0, Socket::IP_TTL, ttl)
  24. send_socket.connect(Socket.pack_sockaddr_in(port, destination))
  25. send_socket.puts ""
  26.  
  27. curr_addr = nil
  28. curr_name = nil
  29.  
  30. begin
  31. Timeout.timeout(1) {
  32. data, sender = recv_socket.recvfrom 8192
  33. curr_addr = Socket.unpack_sockaddr_in(sender)[1].to_s
  34. }
  35.  
  36. begin
  37. curr_name = Socket.getaddrinfo(curr_addr, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)[0][2]
  38. rescue SocketError => e
  39. curr_name = curr_addr
  40. end
  41.  
  42. if curr_name.empty?
  43. curr_host = "*"
  44. else
  45. curr_host = "#{curr_name} (#{curr_addr})"
  46. end
  47. puts "#{ttl}\t#{curr_host}"
  48.  
  49. if curr_addr == dest_address or ttl > max_hops
  50. break
  51. end
  52. rescue Timeout::Error
  53. puts "#{ttl}\t*"
  54. ensure
  55. recv_socket.close
  56. send_socket.close
  57. end
  58.  
  59. ttl = ttl + 1
  60. end
  61. end
  62.  
  63. traceroute("google.com")
Add Comment
Please, Sign In to add comment