/** * Determines own remote IP address (e.g. can be used to probe if we are * reachable from outside by determining external IP and then connect to it. * This is accomblished by connecting to the IP of www.shipsimu.org which * should default to 188.138.90.169 and requesting /ip.php which does only * return the content of $_SERVER['REMOTE_ADDR']. Of course, this method * requires a working Internet connection. * * This method is taken from a user comment on php.net and heavily rewritten. * Compare to following link: * http://de.php.net/manual/en/function.socket-create.php#49368 * * @return $externalAddress The determined external IP address * @todo Make IP, host name, port and script name configurable */ public static function determineExternalAddress () { // Get helper instance $helperInstance = new ConsoleTools(); // First get a socket // @TODO Add some DNS caching here // Open connection if ($helperInstance->isProxyUsed() === TRUE) { // Resolve hostname into IP address $ip = $helperInstance->resolveIpAddress($helperInstance->getConfigInstance()->getConfigEntry('proxy_host')); // Connect to host through proxy connection $socketResource = fsockopen($ip, $helperInstance->getConfigInstance()->getConfigEntry('proxy_port'), $errorNo, $errorStr, 30); } else { // Connect to host directly $socketResource = fsockopen('188.138.90.169', 80, $errorNo, $errorStr, 30); } // Check if there was an error else if ($errorNo > 0) { // Then throw again throw new InvalidSocketException(array($helperInstance, $socketResource, $errorNo, $errorStr), BaseListener::EXCEPTION_INVALID_SOCKET); } // END - if // Prepare the GET request $request = 'GET ' . ($helperInstance->isProxyUsed() === TRUE ? 'http://shipsimu.org' : '') . '/ip.php HTTP/1.0' . self::HTTP_EOL; $request .= 'Host: shipsimu.org' . self::HTTP_EOL; $request .= 'User-Agent: ' . $this->getUserAgent() . self::HTTP_EOL; $request .= 'Connection: close' . self::HTTP_EOL; // Do we use proxy? if ($helperInstance->isProxyUsed() === TRUE) { // CONNECT method? if ($helperInstance->getConfigInstance()->getConfigEntry('proxy_connect_method') == 'Y') { // Setup proxy tunnel $response = $helperInstance->setupProxyTunnel('shipsimu.org', 80, $socketResource); // If the response is invalid, abort if ((count($response) == 3) && (empty($response[0])) && (empty($response[1])) && (empty($response[2]))) { // Invalid response! $helperInstance->debugBackTrace('Proxy tunnel not working: response=' . print_r($response, TRUE)); } // END - if } else { // Add header for proxy $request .= 'Proxy-Connection: Keep-Alive' . self::HTTP_EOL; } } // END - if // Add last HTTP_EOL $request .= self::HTTP_EOL; // Send it to the socket fwrite($socketResource, $request); // Init IP (this will always be the last line) $externalAddress = 'invalid'; // And read the reply while (!feof($socketResource)) { // Get line $externalAddress = trim(fgets($socketResource, 128)); // Detect HTTP response if ((substr($externalAddress, 0, 7) == 'HTTP/1.') && (substr($externalAddress, -6, 6) != '200 OK')) { // Stop processing break; } // END - if } // END - while // Close socket fclose($socketResource); // Debug message /* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('CONSOLE-TOOLS[' . __METHOD__ . ':' . __LINE__ . ']: Resolved external address: ' . $externalAddress); // Return determined external IP return $externalAddress; }