From: Roland Häder Date: Wed, 8 Jul 2009 16:38:32 +0000 (+0000) Subject: Socket exception added, initListener() basicly finished X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=e6c597aabca33a0ddff1f3e1c0bf45f10eb51a64;p=hub.git Socket exception added, initListener() basicly finished --- diff --git a/.gitattributes b/.gitattributes index a9acfd140..7b6e33dc0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8,6 +8,8 @@ application/hub/data.php -text application/hub/debug.php -text application/hub/exceptions.php -text application/hub/exceptions/.htaccess -text +application/hub/exceptions/socket/.htaccess -text +application/hub/exceptions/socket/class_InvalidSocketException.php -text application/hub/init.php -text application/hub/interfaces/.htaccess -text application/hub/interfaces/connectors/.htaccess -text diff --git a/application/hub/exceptions/socket/.htaccess b/application/hub/exceptions/socket/.htaccess new file mode 100644 index 000000000..3a4288278 --- /dev/null +++ b/application/hub/exceptions/socket/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/application/hub/exceptions/socket/class_InvalidSocketException.php b/application/hub/exceptions/socket/class_InvalidSocketException.php new file mode 100644 index 000000000..79b3609d2 --- /dev/null +++ b/application/hub/exceptions/socket/class_InvalidSocketException.php @@ -0,0 +1,48 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.ship-simu.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +class InvalidSocketException extends FrameworkException { + /** + * A Constructor for this exception + * + * @param $messageArray Error message array + * @param $code Error code + * @return void + */ + public function __construct(array $messageData, $code) { + // Construct the message + $message = sprintf("[%s:] Invalid socket (type %s != resource). errno=%s, errstr=%s", + $messageData[0]->__toString(), + $messageData[1], + $messageData[2], + $messageData[3] + ); + + // Call parent exception constructor + parent::__construct($message, $code); + } +} + +// [EOF] +?> diff --git a/application/hub/main/listener/class_BaseListener.php b/application/hub/main/listener/class_BaseListener.php index 81ae85d92..51088aa05 100644 --- a/application/hub/main/listener/class_BaseListener.php +++ b/application/hub/main/listener/class_BaseListener.php @@ -22,6 +22,9 @@ * along with this program. If not, see . */ class BaseListener extends BaseHubSystem { + // Exception code constants + const EXCEPTION_INVALID_SOCKET = 0xa00; + /** * Used protocol (Default: invalid, which is indeed invalid...) */ @@ -42,6 +45,11 @@ class BaseListener extends BaseHubSystem { */ private $blockingMode = false; + /** + * Socket resource + */ + private $socketResource = null; + /** * Protected constructor * @@ -129,6 +137,44 @@ class BaseListener extends BaseHubSystem { public final function getProtocol () { return $this->protocol; } + + /** + * Setter for blocking-mode + * + * @param $blockingMode Wether blocking-mode is disabled (default) or enabled + * @return void + */ + protected final function setBlockingMode ($blockingMode) { + $this->blockingMode = (boolean) $blockingMode; + } + + /** + * Checks wether blocking-mode is enabled or disabled + * + * @return $blockingMode Wether blocking mode is disabled or enabled + */ + public final function isBlockingModeEnabled () { + return $this->blockingMode; + } + + /** + * Setter for socket resource + * + * @param $socketResource The socket resource we shall set + * @return void + */ + protected final function setSocketResource ($socketResource) { + $this->setSocketResource = $setSocketResource; + } + + /** + * Getter for socket resource + * + * @return $socketResource The socket resource we shall set + */ + protected final function getSocketResource () { + return $this->setSocketResource; + } } // [EOF] diff --git a/application/hub/main/listener/tcp/class_TcpListener.php b/application/hub/main/listener/tcp/class_TcpListener.php index a8a9d3d95..61b3dca83 100644 --- a/application/hub/main/listener/tcp/class_TcpListener.php +++ b/application/hub/main/listener/tcp/class_TcpListener.php @@ -56,9 +56,20 @@ class TcpListener extends BaseListener implements Listenable { * Initializes the listener by setting up the required socket server * * @return void + * @throws InvalidSocketException Thrown if the socket could not be initialized */ public function initListener() { - $this->partialStub('Need to implement this method.'); + // Try to open a TCP socket + $socket = stream_socket_server('tcp://' . $this->getListenAddress() . ':' . $this->getListenPort(), $errno, $errstr); + + // Is the socket a valid resource or do we have any error? + if ((!is_resource($socket)) || ($errno > 0)) { + // Then throw an InvalidSocketException + throw new InvalidSocketException(array($this, gettype($socket), $errno, $errstr), BaseListener::EXCEPTION_INVALID_SOCKET); + } // END - if + + // Remember the socket in our class + $this->setSocketResource($socket); } } diff --git a/application/hub/main/listener/udp/class_UdpListener.php b/application/hub/main/listener/udp/class_UdpListener.php index d37980e33..b3583e0c7 100644 --- a/application/hub/main/listener/udp/class_UdpListener.php +++ b/application/hub/main/listener/udp/class_UdpListener.php @@ -56,9 +56,21 @@ class UdpListener extends BaseListener implements Listenable { * Initializes the listener by setting up the required socket server * * @return void + * @throws InvalidSocketException Thrown if the socket is invalid or an + * error was detected. */ public function initListener() { - $this->partialStub('Need to implement this method.'); + // Try to open a UDP socket + $socket = stream_socket_server('udp://' . $this->getListenAddress() . ':' . $this->getListenPort(), $errno, $errstr, STREAM_SERVER_BIND); + + // Is the socket a valid resource or do we have any error? + if ((!is_resource($socket)) || ($errno > 0)) { + // Then throw an InvalidSocketException + throw new InvalidSocketException(array($this, gettype($socket), $errno, $errstr), BaseListener::EXCEPTION_INVALID_SOCKET); + } // END - if + + // Remember the socket in our class + $this->setSocketResource($socket); } }