Moved some code to BaseListener and called it + updated 'core'.
[hub.git] / application / hub / classes / listener / tcp / class_TcpListener.php
index a5bed83ee6f041afe23c1b2ecd81078ade4fe87a..92eb02e161b27c649bbb32ca0cb731548d1273a5 100644 (file)
@@ -193,132 +193,10 @@ class TcpListener extends BaseListener implements Listenable {
         * "Listens" for incoming network packages
         *
         * @return      void
-        * @throws      InvalidSocketException  If an invalid socket resource has been found
         */
        public function doListen () {
-               // Get all readers
-               $readers = $this->getPoolInstance()->getAllSingleSockets();
-               $writers = array();
-               $excepts = array();
-
-               // Check if we have some peers left
-               $left = socket_select(
-                       $readers,
-                       $writers,
-                       $excepts,
-                       0,
-                       150
-               );
-
-               // Some new peers found?
-               if ($left < 1) {
-                       // Debug message
-                       //* EXTREME-NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('TCP-LISTENER[' . __METHOD__ . ':' . __LINE__ . ']: left=' . $left . ',serverSocket=' . $this->getSocketResource() . ',readers=' . print_r($readers, TRUE));
-
-                       // Nothing new found
-                       return;
-               } // END - if
-
-               // Debug message
-               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('TCP-LISTENER[' . __METHOD__ . ':' . __LINE__ . ']: serverSocket=' . $this->getSocketResource() . ',readers=' . print_r($readers, TRUE));
-
-               // Do we have changed peers?
-               if (in_array($this->getSocketResource(), $readers)) {
-                       /*
-                        * Then accept it, if this socket is set to non-blocking IO and the
-                        * connection is NOT sending any data, socket_read() may throw
-                        * error 11 (Resource temporary unavailable). This really nasty
-                        * because if you have blocking IO socket_read() will wait and wait
-                        * and wait ...
-                        */
-                       $newSocket = socket_accept($this->getSocketResource());
-
-                       // Debug message
-                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('TCP-LISTENER[' . __METHOD__ . ':' . __LINE__ . ']: newSocket=' . $newSocket . ',serverSocket=' .$this->getSocketResource());
-
-                       // Array for timeout settings
-                       $options  = array(
-                               // Seconds
-                               'sec'  => $this->getConfigInstance()->getConfigEntry('tcp_socket_accept_wait_sec'),
-                               // Milliseconds
-                               'usec' => $this->getConfigInstance()->getConfigEntry('tcp_socket_accept_wait_usec')
-                       );
-
-                       // Set timeout to configured seconds
-                       // @TODO Does this work on Windozer boxes???
-                       if (!socket_set_option($newSocket, SOL_SOCKET, SO_RCVTIMEO, $options)) {
-                               // Handle this socket error with a faked recipientData array
-                               $this->handleSocketError(__METHOD__, __LINE__, $newSocket, array('0.0.0.0', '0'));
-                       } // END - if
-
-                       // Output result (only for debugging!)
-                       /*
-                       $option = socket_get_option($newSocket, SOL_SOCKET, SO_RCVTIMEO);
-                       self::createDebugInstance(__CLASS__)->debugOutput('SO_RCVTIMEO[' . gettype($option) . ']=' . print_r($option, TRUE));
-                       */
-
-                       // Enable SO_OOBINLINE
-                       if (!socket_set_option($newSocket, SOL_SOCKET, SO_OOBINLINE ,1)) {
-                               // Handle this socket error with a faked recipientData array
-                               $this->handleSocketError(__METHOD__, __LINE__, $newSocket, array('0.0.0.0', '0'));
-                       } // END - if
-
-                       // Set non-blocking
-                       if (!socket_set_nonblock($newSocket)) {
-                               // Handle this socket error with a faked recipientData array
-                               $this->handleSocketError(__METHOD__, __LINE__, $newSocket, array('0.0.0.0', '0'));
-                       } // END - if
-
-                       // Add it to the peers
-                       $this->getPoolInstance()->addPeer($newSocket, BaseConnectionHelper::CONNECTION_TYPE_INCOMING);
-
-                       // Get peer name
-                       if (!socket_getpeername($newSocket, $peerName)) {
-                               // Handle this socket error with a faked recipientData array
-                               $this->handleSocketError(__METHOD__, __LINE__, $newSocket, array('0.0.0.0', '0'));
-                       } // END - if
-
-                       // Get node instance
-                       $nodeInstance = NodeObjectFactory::createNodeInstance();
-
-                       // Create a faked package data array
-                       $packageData = array(
-                               NetworkPackage::PACKAGE_DATA_SENDER    => $peerName . ':0',
-                               NetworkPackage::PACKAGE_DATA_RECIPIENT => $nodeInstance->getSessionId(),
-                               NetworkPackage::PACKAGE_DATA_STATUS    => NetworkPackage::PACKAGE_STATUS_FAKED
-                       );
-
-                       // Get a connection info instance
-                       $infoInstance = ConnectionInfoFactory::createConnectionInfoInstance($this->getProtocolName(), 'listener');
-
-                       // Will the info instance with listener data
-                       $infoInstance->fillWithListenerInformation($this);
-
-                       // Get a socket registry
-                       $registryInstance = SocketRegistryFactory::createSocketRegistryInstance();
-
-                       // Register the socket with the registry and with the faked array
-                       $registryInstance->registerSocket($infoInstance, $newSocket, $packageData);
-               } // END - if
-
-               // Do we have to rewind?
-               if (!$this->getIteratorInstance()->valid()) {
-                       // Rewind the list
-                       $this->getIteratorInstance()->rewind();
-               } // END - if
-
-               // Get the current value
-               $currentSocket = $this->getIteratorInstance()->current();
-
-               // Handle it here, if not main server socket
-               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('TCP-LISTENER[' . __METHOD__ . ':' . __LINE__ . ']: currentSocket=' . $currentSocket[BasePool::SOCKET_ARRAY_RESOURCE] . ',type=' . $currentSocket[BasePool::SOCKET_ARRAY_CONN_TYPE] . ',serverSocket=' . $this->getSocketResource());
-               if (($currentSocket[BasePool::SOCKET_ARRAY_CONN_TYPE] != BaseConnectionHelper::CONNECTION_TYPE_SERVER) && ($currentSocket[BasePool::SOCKET_ARRAY_RESOURCE] != $this->getSocketResource())) {
-                       // ... or else it will raise warnings like 'Transport endpoint is not connected'
-                       $this->getHandlerInstance()->processRawDataFromResource($currentSocket);
-               } // END - if
-
-               // Advance to next entry. This should be the last line.
-               $this->getIteratorInstance()->next();
+               // Call super method
+               $this->doListenSocketSelect(':0');
        }
 
        /**