+ * Attempts to connect to a peer by given IP number and port from a valid
+ * recipientData array with currently configured timeout.
+ *
+ * @param $recipientData A valid recipient data array, 0=IP; 1=PORT
+ * @return $isConnected Wether the connection went fine
+ * @see Please see http://de.php.net/manual/en/function.socket-connect.php#84465 for original code
+ * @todo Rewrite the while() loop to a iterator to not let the software stay very long here
+ */
+ protected function connectToPeerByRecipientDataArray (array $recipientData) {
+ // Only call this if the connection is initialized by initConnection()
+ assert($this->isInitialized === true);
+
+ // Get current time
+ $time = time();
+
+ // "Cache" socket resource and timeout config
+ $socketResource = $this->getSocketResource();
+ $timeout = $this->getConfigInstance()->getConfigEntry('socket_timeout_seconds');
+
+ // Try to connect until it is connected
+ while ($isConnected = !@socket_connect($socketResource, $recipientData[0], $recipientData[1])) {
+ // Get last socket error
+ $socketError = socket_last_error($socketResource);
+
+ // Skip any errors which may happen on non-blocking connections
+ if (($socketError == SOCKET_EINPROGRESS) || ($socketError == SOCKET_EALREADY)) {
+ // Now, is that attempt within parameters?
+ if ((time() - $time) >= $timeout) {
+ // Didn't work within timeout
+ $isConnected = false;
+ break;
+ } // END - if
+
+ // Sleep about one second
+ $this->idle(1000);
+ } elseif ($socketError != 0) {
+ // Stop on everything else pronto
+ $isConnected = false;
+ break;
+ }
+ } // END - while
+
+ // Return status
+ return $isConnected;
+ }
+
+ /**
+ * Static "getter" for this connection class' name
+ *
+ * @param $address IP address
+ * @param $port Port number
+ * @param $className Original class name
+ * @return $class Expanded class name
+ */
+ public static function getConnectionClassName ($address, $port, $className) {
+ // Construct it
+ $class = $address . ':' . $port . ':' . $className;
+
+ // ... and return it
+ return $class;
+ }
+
+ /**
+ * Initializes the peer's state which sets it to 'init'
+ *
+ * @return void
+ */
+ private function initState() {
+ /*
+ * Get the state factory and create the initial state, we don't need
+ * the state instance here
+ */
+ PeerStateFactory::createPeerStateInstanceByName('init', $this);
+ }
+
+ /**
+ * "Getter" for raw data from a package array. A fragmenter is used which
+ * will returns us only so many raw data which fits into the back buffer.
+ * The rest is being held in a back-buffer and waits there for the next
+ * cycle and while be then sent.
+ *
+ * This method does 4 simple steps:
+ * 1) Aquire fragmenter object instance from the factory
+ * 2) Handle over the package data array to the fragmenter
+ * 3) Request a chunk
+ * 4) Finally return the chunk (array) to the caller