| @ -1,83 +0,0 @@ | |||||
| <?php | |||||
| $data = "var tracepoints = {'points': ["; | |||||
| define ("SOL_IP", 0); | |||||
| define ("IP_TTL", 2); // On OSX, use '4' instead of '2'. | |||||
| $dest_url = "google.com"; | |||||
| $maximum_hops = 30; | |||||
| $port = 33434; | |||||
| function ip2geo ($host) { | |||||
| global $argv; | |||||
| // Get GeoIP info | |||||
| @$data = file_get_contents('http://ipinfo.io/'.$host); | |||||
| if ($data) { | |||||
| $data = json_decode($data); | |||||
| return $data->loc; | |||||
| } else { | |||||
| // An error has accourred | |||||
| return "(No geo info found)"; | |||||
| } | |||||
| } | |||||
| $dest_addr = gethostbyname ($dest_url); | |||||
| $ttl = 1; | |||||
| while ($ttl < $maximum_hops) { | |||||
| // Create ICMP and UDP sockets | |||||
| $recv_socket = socket_create (AF_INET, SOCK_RAW, getprotobyname ('icmp')); | |||||
| $send_socket = socket_create (AF_INET, SOCK_DGRAM, getprotobyname ('udp')); | |||||
| // Set TTL to current lifetime | |||||
| socket_set_option ($send_socket, SOL_IP, IP_TTL, $ttl); | |||||
| // Bind receiving ICMP socket to default IP (no port needed since it's ICMP) | |||||
| socket_bind ($recv_socket, 0, 0); | |||||
| // Save the current time for roundtrip calculation | |||||
| $t1 = microtime (true); | |||||
| // Send a zero sized UDP packet towards the destination | |||||
| socket_sendto ($send_socket, "", 0, 0, $dest_addr, $port); | |||||
| // Wait for an event to occur on the socket or timeout after 5 seconds. This will take care of the | |||||
| // hanging when no data is received (packet is dropped silently for example) | |||||
| $r = array ($recv_socket); | |||||
| $w = $e = array (); | |||||
| socket_select ($r, $w, $e, 5, 0); | |||||
| // Nothing to read, which means a timeout has occurred. | |||||
| if (count ($r)) { | |||||
| // Receive data from socket (and fetch destination address from where this data was found) | |||||
| socket_recvfrom ($recv_socket, $buf, 512, 0, $recv_addr, $recv_port); | |||||
| $recv_geo = ip2geo ($recv_addr); | |||||
| $recv_geo_split = explode(",", $recv_geo); | |||||
| $data .= sprintf("{'x':%s,'y':%s},", $recv_geo_split[0], $recv_geo_split[1]); | |||||
| } | |||||
| socket_close ($recv_socket); | |||||
| socket_close ($send_socket); | |||||
| $ttl++; | |||||
| if ($recv_addr == $dest_addr) break; | |||||
| } | |||||
| $data = substr($data, 0, -1) . "]}"; | |||||
| printf ("%s\n", $data); | |||||
| $fp = fopen('traceroute.js', 'w'); | |||||
| fwrite($fp, json_encode($data)); | |||||
| fclose($fp); | |||||
| ?> | |||||