self::createDebugInstance(__CLASS__)->debugOutput('CONNECTION-HELPER[' . __METHOD__ . ':' . __LINE__ . ']: Trying to connect to ' . $unlData[UniversalNodeLocator::UNL_PART_ADDRESS] . ':' . $unlData[UniversalNodeLocator::UNL_PART_PORT] . ' with socketResource[' . gettype($socketResource) . ']=' . $socketResource . ' ...');
// Get current time
+ $hasTimedOut = FALSE;
$time = time();
// Try to connect until it is connected
// Get last socket error
$socketError = socket_last_error($socketResource);
+ // Log error code and status
+ /* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('CONNECTION-HELPER[' . __METHOD__ . ':' . __LINE__ . ']: socketError=' . $socketError . ',isConnected=' . intval($isConnected));
+
// Skip any errors which may happen on non-blocking connections
if (($socketError == SOCKET_EINPROGRESS) || ($socketError == SOCKET_EALREADY)) {
// Now, is that attempt within parameters?
// Didn't work within timeout
$isConnected = FALSE;
+ $hasTimedOut = TRUE;
break;
} // END - if
}
} // END - while
+ /*
+ * All IPv4-based connections are non-blocking used by this program or
+ * else the PHP process will "hang" until a peer connects which is not
+ * what is wanted here. This means, that all connections will end with
+ * isConnected=FALSE here.
+ */
+ if (($hasTimedOut === FALSE) && ($socketError == SOCKET_EINPROGRESS)) {
+ // A "connection in progress" has not timed out. All fine.
+ $isConnected = TRUE;
+
+ // Clear error
+ socket_clear_error($socketResource);
+ } // END - if
+
// Log error code
- /* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('CONNECTION-HELPER[' . __METHOD__ . ':' . __LINE__ . ']: socketError=' . $socketError . ',isConnected=' . intval($isConnected) . ' after while() loop.');
+ /* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('CONNECTION-HELPER[' . __METHOD__ . ':' . __LINE__ . ']: socketError=' . $socketError . ',isConnected=' . intval($isConnected) . ',hasTimedOut=' . intval($hasTimedOut) . ' after while() loop.');
// Is the peer connected?
- if ($isConnected === TRUE) {
+ if (($isConnected === TRUE) || (($socketError == SOCKET_EINPROGRESS) && ($hasTimedOut === FALSE))) {
// Connection is fully established here, so change the state.
PeerStateFactory::createPeerStateInstanceByName('connected', $this);
} else {