|
|
- <?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);
-
-
- ?>
|