diff options
Diffstat (limited to 'ace/SOCK_Connector.cpp')
-rw-r--r-- | ace/SOCK_Connector.cpp | 262 |
1 files changed, 78 insertions, 184 deletions
diff --git a/ace/SOCK_Connector.cpp b/ace/SOCK_Connector.cpp index 9938d839f4a..0d2c4ddabb5 100644 --- a/ace/SOCK_Connector.cpp +++ b/ace/SOCK_Connector.cpp @@ -20,15 +20,22 @@ ACE_SOCK_Connector::dump (void) const ACE_TRACE ("ACE_SOCK_Connector::dump"); } -int -ACE_SOCK_Connector::shared_connect_start (ACE_SOCK_Stream &new_stream, - ACE_Time_Value *timeout, - const ACE_Addr &local_sap, - int reuse_addr, - int protocol_family, - int protocol) +// Actively connect and produce a new ACE_SOCK_Stream if things go well... + +int +ACE_SOCK_Connector::connect (ACE_SOCK_Stream &new_stream, + const ACE_Addr &remote_sap, + ACE_Time_Value *timeout, + const ACE_Addr &local_sap, + int reuse_addr, + int /* flags */, + int /* perms */, + int protocol_family, + int protocol) { - ACE_TRACE ("ACE_SOCK_Connector::shared_connect_start"); + ACE_TRACE ("ACE_SOCK_Connector::connect"); + int result = 0; + // Only open a new socket if we don't already have a valid handle. if (new_stream.get_handle () == ACE_INVALID_HANDLE && new_stream.open (SOCK_STREAM, @@ -36,126 +43,66 @@ ACE_SOCK_Connector::shared_connect_start (ACE_SOCK_Stream &new_stream, protocol, reuse_addr) == -1) return -1; - else if (local_sap != ACE_Addr::sap_any) + + sockaddr *raddr = (sockaddr *) remote_sap.get_addr (); + size_t rsize = remote_sap.get_size (); + + if (local_sap != ACE_Addr::sap_any) { sockaddr *laddr = (sockaddr *) local_sap.get_addr (); size_t size = local_sap.get_size (); - if (ACE_OS::bind (new_stream.get_handle (), - laddr, - size) == -1) + result = ACE_OS::bind (new_stream.get_handle (), + laddr, + size); + + if (result == -1) { - // Save/restore errno. - ACE_Errno_Guard error (errno); new_stream.close (); return -1; } } // Enable non-blocking, if required. - if (timeout != 0 && new_stream.enable (ACE_NONBLOCK) == -1) - return -1; - else - return 0; -} - -int -ACE_SOCK_Connector::shared_connect_finish (ACE_SOCK_Stream &new_stream, - ACE_Time_Value *timeout, - int result) -{ - ACE_TRACE ("ACE_SOCK_Connector::shared_connect_finish"); - // Save/restore errno. - ACE_Errno_Guard error (errno); - - if (result == -1 && timeout != 0) + if (timeout != 0) { - // Check whether the connection is in progress. - if (error == EINPROGRESS || error == EWOULDBLOCK) + if (new_stream.enable (ACE_NONBLOCK) == -1) + result = -1; + + if (ACE_OS::connect (new_stream.get_handle (), raddr, rsize) == -1) { - // This expression checks if we were polling. - if (timeout->sec () == 0 && timeout->usec () == 0) - error = EWOULDBLOCK; - // Wait synchronously using timeout. - else if (this->complete (new_stream, - 0, - timeout) == -1) - error = errno; - else - return 0; + result = -1; + + // Check whether the connection is in progress. + if (errno == EINPROGRESS || errno == EWOULDBLOCK) + { + // This expression checks if we were polling. + if (timeout->sec () == 0 && timeout->usec () == 0) + errno = EWOULDBLOCK; + // Wait synchronously + else if (this->complete (new_stream, 0, timeout) != -1) + return 0; + } } } + // Do a blocking connect. + else if (ACE_OS::connect (new_stream.get_handle (), raddr, rsize) == -1) + result = -1; // EISCONN is treated specially since this routine may be used to // check if we are already connected. - if (result != -1 || error == EISCONN) + if (result != -1 || errno == EISCONN) // Start out with non-blocking disabled on the <new_stream>. new_stream.disable (ACE_NONBLOCK); - else if (!(error == EWOULDBLOCK || error == ETIMEDOUT)) - new_stream.close (); - + else if (!(errno == EWOULDBLOCK || errno == ETIMEDOUT)) + { + // If things have gone wrong, close down and return an error. + int saved_errno = errno; + new_stream.close (); + errno = saved_errno; + } + return result; } -// Actively connect and produce a new ACE_SOCK_Stream if things go well... - -int -ACE_SOCK_Connector::connect (ACE_SOCK_Stream &new_stream, - const ACE_Addr &remote_sap, - ACE_Time_Value *timeout, - const ACE_Addr &local_sap, - int reuse_addr, - int /* flags */, - int /* perms */, - int protocol_family, - int protocol) -{ - ACE_TRACE ("ACE_SOCK_Connector::connect"); - if (this->shared_connect_start (new_stream, - timeout, - local_sap, - reuse_addr, - protocol_family, - protocol) == -1) - return -1; - - int result = ACE_OS::connect (new_stream.get_handle (), - (sockaddr *) remote_sap.get_addr (), - remote_sap.get_size ()); - - return this->shared_connect_finish (new_stream, - timeout, - result); -} - -int -ACE_SOCK_Connector::connect (ACE_SOCK_Stream &new_stream, - const ACE_Addr &remote_sap, - ACE_Connect_QoS_Params qos_params, - ACE_Time_Value *timeout, - const ACE_Addr &local_sap, - int reuse_addr, - int /* flags */, - int /* perms */, - int protocol_family, - int protocol) -{ - ACE_TRACE ("ACE_SOCK_Connector::connect"); - if (this->shared_connect_start (new_stream, - timeout, - local_sap, - reuse_addr, - protocol_family, - protocol) == -1) - return -1; - - int result = ACE_OS::connect (new_stream.get_handle (), - (sockaddr *) remote_sap.get_addr (), - remote_sap.get_size (), - qos_params); - - return this->shared_connect_finish (new_stream, - timeout, - result); -} // Try to complete a non-blocking connection. @@ -172,92 +119,39 @@ ACE_SOCK_Connector::complete (ACE_SOCK_Stream &new_stream, ACE_Time_Value time (0, ACE_NON_BLOCKING_BUG_DELAY); ACE_OS::sleep (time); #endif /* ACE_HAS_BROKEN_NON_BLOCKING_CONNECTS */ - ACE_HANDLE h = ACE::handle_timed_complete (new_stream.get_handle (), - tv); - // We failed to get connected. + ACE_HANDLE h = ACE::handle_timed_complete (new_stream.get_handle (), tv); + if (h == ACE_INVALID_HANDLE) { - // Save/restore errno. - ACE_Errno_Guard error (errno); + // Preserve the value of errno across the close() call. + int error = errno; new_stream.close (); + errno = error; return -1; } - else if (remote_sap != 0) + else // We've successfully connected! { - int len = remote_sap->get_size (); - sockaddr *addr = (sockaddr *) remote_sap->get_addr (); - - if (ACE_OS::getpeername (h, - addr, - &len) == -1) + if (remote_sap != 0) { - // Save/restore errno. - ACE_Errno_Guard error (errno); - new_stream.close (); - return -1; + int len; + + len = remote_sap->get_size (); + sockaddr *addr = (sockaddr *) remote_sap->get_addr (); + + if (ACE_OS::getpeername (h, addr, &len) == -1) + { + // Preserve the value of errno across the close() call. + int error = errno; + new_stream.close (); + errno = error; + return -1; + } } - } - - // Start out with non-blocking disabled on the <new_stream>. - new_stream.disable (ACE_NONBLOCK); - return 0; -} - -ACE_SOCK_Connector::ACE_SOCK_Connector (ACE_SOCK_Stream &new_stream, - const ACE_Addr &remote_sap, - ACE_Time_Value *timeout, - const ACE_Addr &local_sap, - int reuse_addr, - int flags, - int perms, - int protocol_family, - int protocol) -{ - ACE_TRACE ("ACE_SOCK_Connector::ACE_SOCK_Connector"); - if (this->connect (new_stream, - remote_sap, - timeout, - local_sap, - reuse_addr, - flags, - perms, - protocol_family, - protocol) == -1 - && timeout != 0 - && !(errno == EWOULDBLOCK || errno == ETIME)) - ACE_ERROR ((LM_ERROR, - ASYS_TEXT ("%p\n"), - ASYS_TEXT ("ACE_SOCK_Connector::ACE_SOCK_Connector"))); + // Start out with non-blocking disabled on the <new_stream>. + new_stream.disable (ACE_NONBLOCK); + return 0; + } } -ACE_SOCK_Connector::ACE_SOCK_Connector (ACE_SOCK_Stream &new_stream, - const ACE_Addr &remote_sap, - ACE_Connect_QoS_Params qos_params, - ACE_Time_Value *timeout, - const ACE_Addr &local_sap, - int reuse_addr, - int flags, - int perms, - int protocol_family, - int protocol) -{ - ACE_TRACE ("ACE_SOCK_Connector::ACE_SOCK_Connector"); - - if (this->connect (new_stream, - remote_sap, - qos_params, - timeout, - local_sap, - reuse_addr, - flags, - perms, - protocol_family, - protocol) == -1 - && timeout != 0 - && !(errno == EWOULDBLOCK || errno == ETIME)) - ACE_ERROR ((LM_ERROR, - ASYS_TEXT ("%p\n"), - ASYS_TEXT ("ACE_SOCK_Connector::ACE_SOCK_Connector"))); -} |