* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
class ConsoleTools extends BaseFrameworkSystem {
+ // Constants
+ const HTTP_EOL = "\r\n";
+ const HTTP_USER_AGENT = 'ConsoleTools/1.0';
+
/**
* Protected constructor
*
* 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.ship-simu.org which
- * should default to 217.172.186.31. Of course, this method requires a valid
- * and working Internet connection to work properly.
+ * should default to 217.172.186.31 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 and lightly rewritten from a user comment on php.net:
+ * 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
*
- * @param $dest IP destination we should connect to
- * @param $port Port destination we should connect to
* @return $externalAddress The determined external IP address
* @throws InvalidSocketException If socket initialization wents wrong or if an errors occurs
+ * @todo This should be moved out to an external class, e.g. HttpClient
*/
- public static function determineExternalIp ($dest = '217.172.186.31', $port = 80) {
+ public static function determineExternalIp () {
// Get helper instance
$helperInstance = new ConsoleTools();
// First get a socket
- $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
-
- // Is it valid?
- if (!is_resource($socket)) {
- // Throw InvalidSocketException
- throw new InvalidSocketException (array($helperInstance, gettype($socket), 0, 'unknown'));
- } // END - if
-
- // Get socket error code for verification
- $socketError = socket_last_error($socket);
+ $socket = fsockopen('217.172.186.31', 80, $errorNo, $errorStr, 5);
// Check if there was an error else
- if ($socketError > 0) {
+ if ($errorNo > 0) {
// Then throw again
- throw new InvalidSocketException(array($helperInstance, gettype($socket), $socketError, socket_strerror($socketError)), BaseListener::EXCEPTION_INVALID_SOCKET);
+ throw new InvalidSocketException(array($helperInstance, gettype($socket), $errorNo, $errorStr), BaseListener::EXCEPTION_INVALID_SOCKET);
} // END - if
- // Connect to the destination
- socket_connect($socket, $dest, $port);
+ // Prepare the GET request
+ $request = 'GET /ip.php HTTP/1.0' . self::HTTP_EOL;
+ $request .= 'Host: www.ship-simu.org' . self::HTTP_EOL;
+ $request .= 'User-Agent: ' . self::HTTP_USER_AGENT . self::HTTP_EOL;
+ $request .= 'Connection: close' . self::HTTP_EOL;
+ $request .= self::HTTP_EOL;
+
+ // Send it to the socket
+ fwrite($socket, $request);
+
+ // Init IP (this will always be the last line)
+ $externalAddress = 'invalid';
- // Get the socket address (our external IP) and port (ignored)
- socket_getsockname($socket, $externalAddress, $ourPort);
+ // And read the reply
+ while (!feof($socket)) {
+ $externalAddress = fgets($socket, 128);
+ } // END - while
- // Close the socket
- socket_close($socket);
+ // Close socket
+ fclose($socket);
// Return determined external IP
return $externalAddress;