From f6368b592b8d4082f856002f6550f37bcfeeea83 Mon Sep 17 00:00:00 2001 From: Roland Haeder Date: Tue, 22 Dec 2015 21:45:48 +0100 Subject: [PATCH] In case of non-blocking connections (and that is for 99.9999% the case here) the "error" "operation in progress" is no error and needs to be cleared in PHP's socket facility + also treated by this code as okay. Signed-off-by: Roland Haeder --- .../ipv4/class_BaseIpV4ConnectionHelper.php | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/application/hub/classes/helper/connection/ipv4/class_BaseIpV4ConnectionHelper.php b/application/hub/classes/helper/connection/ipv4/class_BaseIpV4ConnectionHelper.php index ba7e7393b..f1dfa8305 100644 --- a/application/hub/classes/helper/connection/ipv4/class_BaseIpV4ConnectionHelper.php +++ b/application/hub/classes/helper/connection/ipv4/class_BaseIpV4ConnectionHelper.php @@ -121,6 +121,7 @@ class BaseIpV4ConnectionHelper extends BaseConnectionHelper { 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 @@ -128,6 +129,9 @@ class BaseIpV4ConnectionHelper extends BaseConnectionHelper { // 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? @@ -137,6 +141,7 @@ class BaseIpV4ConnectionHelper extends BaseConnectionHelper { // Didn't work within timeout $isConnected = FALSE; + $hasTimedOut = TRUE; break; } // END - if @@ -152,11 +157,25 @@ class BaseIpV4ConnectionHelper extends BaseConnectionHelper { } } // 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 { -- 2.39.5