-
- /**
- * Determines own remote IP address (e.g. can be used to probe if we are
- * reachable from outside by determining external address 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 address 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 address
- return $externalAddress;
- }