* "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');
}
/**