summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpp/CHANGES3
-rw-r--r--cpp/src/Ice/TcpConnector.cpp28
-rw-r--r--cpp/src/Ice/TcpTransceiver.cpp19
-rw-r--r--cpp/src/IceSSL/ConnectorI.cpp64
-rw-r--r--cpp/src/IceSSL/TransceiverI.cpp200
-rw-r--r--cs/src/Ice/TcpConnector.cs30
-rw-r--r--cs/src/Ice/TcpTransceiver.cs19
-rw-r--r--java/src/IceInternal/TcpConnector.java28
-rw-r--r--java/src/IceInternal/TcpTransceiver.java19
-rw-r--r--java/src/IceSSL/ConnectorI.java29
-rw-r--r--java/src/IceSSL/TransceiverI.java56
11 files changed, 310 insertions, 185 deletions
diff --git a/cpp/CHANGES b/cpp/CHANGES
index 4105655f0a4..aed6ab9a646 100644
--- a/cpp/CHANGES
+++ b/cpp/CHANGES
@@ -1,6 +1,9 @@
Changes since version 3.2.X (binary incompatible)
-------------------------------------------------
+- Network tracing now also includes failures to connect if
+ the Ice.Trace.Network property is set to 2.
+
- The Ice locator tracing (enabled with the `Ice.Trace.Locator'
property) now traces calls to locator registry when an object
adapter updates its endpoints or the server process proxy is
diff --git a/cpp/src/Ice/TcpConnector.cpp b/cpp/src/Ice/TcpConnector.cpp
index eadb705f8e8..956907ad2c6 100644
--- a/cpp/src/Ice/TcpConnector.cpp
+++ b/cpp/src/Ice/TcpConnector.cpp
@@ -29,19 +29,31 @@ IceInternal::TcpConnector::connect(int timeout)
out << "trying to establish tcp connection to " << toString();
}
- SOCKET fd = createSocket(false, _addr.ss_family);
- setBlock(fd, false);
- setTcpBufSize(fd, _instance->initializationData().properties, _logger);
- bool connected = doConnect(fd, _addr, timeout);
- if(connected)
+ try
{
- if(_traceLevels->network >= 1)
+ SOCKET fd = createSocket(false, _addr.ss_family);
+ setBlock(fd, false);
+ setTcpBufSize(fd, _instance->initializationData().properties, _logger);
+ bool connected = doConnect(fd, _addr, timeout);
+ if(connected)
+ {
+ if(_traceLevels->network >= 1)
+ {
+ Trace out(_logger, _traceLevels->networkCat);
+ out << "tcp connection established\n" << fdToString(fd);
+ }
+ }
+ return new TcpTransceiver(_instance, fd, connected);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ if(_traceLevels->network >= 2)
{
Trace out(_logger, _traceLevels->networkCat);
- out << "tcp connection established\n" << fdToString(fd);
+ out << "failed to establish tcp connection to " << toString() << "\n" << ex;
}
+ throw;
}
- return new TcpTransceiver(_instance, fd, connected);
}
Short
diff --git a/cpp/src/Ice/TcpTransceiver.cpp b/cpp/src/Ice/TcpTransceiver.cpp
index 09f54e846fa..e7f0ee4acab 100644
--- a/cpp/src/Ice/TcpTransceiver.cpp
+++ b/cpp/src/Ice/TcpTransceiver.cpp
@@ -372,9 +372,22 @@ IceInternal::TcpTransceiver::initialize(int timeout)
}
else if(_state <= StateConnectPending)
{
- doFinishConnect(_fd, timeout);
- _state = StateConnected;
- _desc = fdToString(_fd);
+ try
+ {
+ doFinishConnect(_fd, timeout);
+ _state = StateConnected;
+ _desc = fdToString(_fd);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ if(_traceLevels->network >= 2)
+ {
+ Trace out(_logger, _traceLevels->networkCat);
+ out << "failed to establish tcp connection\n" << _desc << "\n" << ex;
+ }
+ throw;
+ }
+
if(_traceLevels->network >= 1)
{
Trace out(_logger, _traceLevels->networkCat);
diff --git a/cpp/src/IceSSL/ConnectorI.cpp b/cpp/src/IceSSL/ConnectorI.cpp
index 31f2c176e15..b66c005dc09 100644
--- a/cpp/src/IceSSL/ConnectorI.cpp
+++ b/cpp/src/IceSSL/ConnectorI.cpp
@@ -40,36 +40,48 @@ IceSSL::ConnectorI::connect(int timeout)
out << "trying to establish ssl connection to " << toString();
}
- SOCKET fd = IceInternal::createSocket(false, _addr.ss_family);
- IceInternal::setBlock(fd, false);
- IceInternal::setTcpBufSize(fd, _instance->communicator()->getProperties(), _logger);
- bool connected = IceInternal::doConnect(fd, _addr, timeout);
-
- // This static_cast is necessary due to 64bit windows. There SOCKET is a non-int type.
- BIO* bio = BIO_new_socket(static_cast<int>(fd), BIO_CLOSE);
- if(!bio)
+ try
{
- IceInternal::closeSocketNoThrow(fd);
- SecurityException ex(__FILE__, __LINE__);
- ex.reason = "openssl failure";
- throw ex;
+ SOCKET fd = IceInternal::createSocket(false, _addr.ss_family);
+ IceInternal::setBlock(fd, false);
+ IceInternal::setTcpBufSize(fd, _instance->communicator()->getProperties(), _logger);
+ bool connected = IceInternal::doConnect(fd, _addr, timeout);
+
+ // This static_cast is necessary due to 64bit windows. There SOCKET is a non-int type.
+ BIO* bio = BIO_new_socket(static_cast<int>(fd), BIO_CLOSE);
+ if(!bio)
+ {
+ IceInternal::closeSocketNoThrow(fd);
+ SecurityException ex(__FILE__, __LINE__);
+ ex.reason = "openssl failure";
+ throw ex;
+ }
+
+ SSL* ssl = SSL_new(_instance->context());
+ if(!ssl)
+ {
+ BIO_free(bio); // Also closes the socket.
+ SecurityException ex(__FILE__, __LINE__);
+ ex.reason = "openssl failure";
+ throw ex;
+ }
+ SSL_set_bio(ssl, bio, bio);
+
+ //
+ // SSL handshaking is performed in TransceiverI::initialize, since
+ // connect must not block.
+ //
+ return new TransceiverI(_instance, ssl, fd, connected, false);
}
-
- SSL* ssl = SSL_new(_instance->context());
- if(!ssl)
+ catch(const Ice::LocalException& ex)
{
- BIO_free(bio); // Also closes the socket.
- SecurityException ex(__FILE__, __LINE__);
- ex.reason = "openssl failure";
- throw ex;
+ if(_instance->networkTraceLevel() >= 2)
+ {
+ Trace out(_logger, _instance->networkTraceCategory());
+ out << "failed to establish ssl connection to " << toString() << "\n" << ex;
+ }
+ throw;
}
- SSL_set_bio(ssl, bio, bio);
-
- //
- // SSL handshaking is performed in TransceiverI::initialize, since
- // connect must not block.
- //
- return new TransceiverI(_instance, ssl, fd, connected, false);
}
Short
diff --git a/cpp/src/IceSSL/TransceiverI.cpp b/cpp/src/IceSSL/TransceiverI.cpp
index 9b4fdb7f726..6a03d3f3975 100644
--- a/cpp/src/IceSSL/TransceiverI.cpp
+++ b/cpp/src/IceSSL/TransceiverI.cpp
@@ -420,145 +420,157 @@ IceSSL::TransceiverI::toString() const
IceInternal::SocketStatus
IceSSL::TransceiverI::initialize(int timeout)
{
- if(_state == StateNeedConnect && timeout == 0)
+ try
{
- _state = StateConnectPending;
- return IceInternal::NeedConnect;
- }
- else if(_state <= StateConnectPending)
- {
- IceInternal::doFinishConnect(_fd, timeout);
- _state = StateConnected;
- _desc = IceInternal::fdToString(_fd);
- }
- assert(_state == StateConnected);
-
- do
- {
- //
- // Only one thread calls initialize(), so synchronization is not necessary here.
- //
- int ret = _incoming ? SSL_accept(_ssl) : SSL_connect(_ssl);
- switch(SSL_get_error(_ssl, ret))
+ if(_state == StateNeedConnect && timeout == 0)
{
- case SSL_ERROR_NONE:
- assert(SSL_is_init_finished(_ssl));
- break;
- case SSL_ERROR_ZERO_RETURN:
+ _state = StateConnectPending;
+ return IceInternal::NeedConnect;
+ }
+ else if(_state <= StateConnectPending)
{
- ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = IceInternal::getSocketErrno();
- throw ex;
+ IceInternal::doFinishConnect(_fd, timeout);
+ _state = StateConnected;
+ _desc = IceInternal::fdToString(_fd);
}
- case SSL_ERROR_WANT_READ:
+ assert(_state == StateConnected);
+
+ do
{
- if(timeout == 0)
+ //
+ // Only one thread calls initialize(), so synchronization is not necessary here.
+ //
+ int ret = _incoming ? SSL_accept(_ssl) : SSL_connect(_ssl);
+ switch(SSL_get_error(_ssl, ret))
{
- return IceInternal::NeedRead;
- }
- if(!selectRead(_fd, timeout))
+ case SSL_ERROR_NONE:
+ assert(SSL_is_init_finished(_ssl));
+ break;
+ case SSL_ERROR_ZERO_RETURN:
{
- throw ConnectTimeoutException(__FILE__, __LINE__);
+ ConnectionLostException ex(__FILE__, __LINE__);
+ ex.error = IceInternal::getSocketErrno();
+ throw ex;
}
- break;
- }
- case SSL_ERROR_WANT_WRITE:
- {
- if(timeout == 0)
+ case SSL_ERROR_WANT_READ:
{
- return IceInternal::NeedWrite;
+ if(timeout == 0)
+ {
+ return IceInternal::NeedRead;
+ }
+ if(!selectRead(_fd, timeout))
+ {
+ throw ConnectTimeoutException(__FILE__, __LINE__);
+ }
+ break;
}
- if(!selectWrite(_fd, timeout))
+ case SSL_ERROR_WANT_WRITE:
{
- throw ConnectTimeoutException(__FILE__, __LINE__);
+ if(timeout == 0)
+ {
+ return IceInternal::NeedWrite;
+ }
+ if(!selectWrite(_fd, timeout))
+ {
+ throw ConnectTimeoutException(__FILE__, __LINE__);
+ }
+ break;
}
- break;
- }
- case SSL_ERROR_SYSCALL:
- {
- if(ret == -1)
+ case SSL_ERROR_SYSCALL:
{
- if(IceInternal::interrupted())
+ if(ret == -1)
{
- break;
- }
+ if(IceInternal::interrupted())
+ {
+ break;
+ }
- if(IceInternal::wouldBlock())
- {
- if(SSL_want_read(_ssl))
+ if(IceInternal::wouldBlock())
{
- if(timeout == 0)
+ if(SSL_want_read(_ssl))
{
- return IceInternal::NeedRead;
+ if(timeout == 0)
+ {
+ return IceInternal::NeedRead;
+ }
+ if(!selectRead(_fd, timeout))
+ {
+ throw ConnectTimeoutException(__FILE__, __LINE__);
+ }
}
- if(!selectRead(_fd, timeout))
+ else if(SSL_want_write(_ssl))
{
- throw ConnectTimeoutException(__FILE__, __LINE__);
+ if(timeout == 0)
+ {
+ return IceInternal::NeedWrite;
+ }
+ if(!selectWrite(_fd, timeout))
+ {
+ throw ConnectTimeoutException(__FILE__, __LINE__);
+ }
}
+
+ break;
}
- else if(SSL_want_write(_ssl))
+
+ if(IceInternal::connectionLost())
{
- if(timeout == 0)
- {
- return IceInternal::NeedWrite;
- }
- if(!selectWrite(_fd, timeout))
- {
- throw ConnectTimeoutException(__FILE__, __LINE__);
- }
+ ConnectionLostException ex(__FILE__, __LINE__);
+ ex.error = IceInternal::getSocketErrno();
+ throw ex;
}
-
- break;
}
-
- if(IceInternal::connectionLost())
+
+ if(ret == 0)
{
ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = IceInternal::getSocketErrno();
+ ex.error = 0;
throw ex;
}
- }
- if(ret == 0)
- {
- ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = 0;
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = IceInternal::getSocketErrno();
throw ex;
}
-
- SocketException ex(__FILE__, __LINE__);
- ex.error = IceInternal::getSocketErrno();
- throw ex;
- }
- case SSL_ERROR_SSL:
- {
- struct sockaddr_storage remoteAddr;
- string desc;
- if(IceInternal::fdToRemoteAddress(_fd, remoteAddr))
+ case SSL_ERROR_SSL:
{
- desc = IceInternal::addrToString(remoteAddr);
+ struct sockaddr_storage remoteAddr;
+ string desc;
+ if(IceInternal::fdToRemoteAddress(_fd, remoteAddr))
+ {
+ desc = IceInternal::addrToString(remoteAddr);
+ }
+ ProtocolException ex(__FILE__, __LINE__);
+ ex.reason = "SSL error occurred for new incoming connection:\nremote address = " + desc + "\n" +
+ _instance->sslErrors();
+ throw ex;
+ }
}
- ProtocolException ex(__FILE__, __LINE__);
- ex.reason = "SSL error occurred for new incoming connection:\nremote address = " + desc + "\n" +
- _instance->sslErrors();
- throw ex;
}
+ while(!SSL_is_init_finished(_ssl));
+
+ _instance->verifyPeer(_ssl, _fd, "", _adapterName, _incoming);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ if(_instance->networkTraceLevel() >= 2)
+ {
+ Trace out(_logger, _instance->networkTraceCategory());
+ out << "failed to establish ssl connection\n" << _desc << "\n" << ex;
}
+ throw;
}
- while(!SSL_is_init_finished(_ssl));
-
- _instance->verifyPeer(_ssl, _fd, "", _adapterName, _incoming);
if(_instance->networkTraceLevel() >= 1)
{
Trace out(_logger, _instance->networkTraceCategory());
if(_incoming)
{
- out << "accepted ssl connection\n" << IceInternal::fdToString(_fd);
+ out << "accepted ssl connection\n" << _desc;
}
else
{
- out << "ssl connection established\n" << IceInternal::fdToString(_fd);
+ out << "ssl connection established\n" << _desc;
}
}
diff --git a/cs/src/Ice/TcpConnector.cs b/cs/src/Ice/TcpConnector.cs
index 5d522b35ffc..9dd63b063ce 100644
--- a/cs/src/Ice/TcpConnector.cs
+++ b/cs/src/Ice/TcpConnector.cs
@@ -24,20 +24,32 @@ namespace IceInternal
string s = "trying to establish tcp connection to " + ToString();
_logger.trace(_traceLevels.networkCat, s);
}
-
- Socket fd = Network.createSocket(false, _addr.AddressFamily);
- Network.setBlock(fd, false);
- Network.setTcpBufSize(fd, instance_.initializationData().properties, _logger);
- bool connected = Network.doConnect(fd, _addr, timeout);
- if(connected)
+
+ try
+ {
+ Socket fd = Network.createSocket(false, _addr.AddressFamily);
+ Network.setBlock(fd, false);
+ Network.setTcpBufSize(fd, instance_.initializationData().properties, _logger);
+ bool connected = Network.doConnect(fd, _addr, timeout);
+ if(connected)
+ {
+ if(_traceLevels.network >= 1)
+ {
+ string s = "tcp connection established\n" + Network.fdToString(fd);
+ _logger.trace(_traceLevels.networkCat, s);
+ }
+ }
+ return new TcpTransceiver(instance_, fd, connected);
+ }
+ catch(Ice.LocalException ex)
{
- if(_traceLevels.network >= 1)
+ if(_traceLevels.network >= 2)
{
- string s = "tcp connection established\n" + Network.fdToString(fd);
+ string s = "failed to establish tcp connection to " + ToString() + "\n" + ex;
_logger.trace(_traceLevels.networkCat, s);
}
+ throw ex;
}
- return new TcpTransceiver(instance_, fd, connected);
}
public short type()
diff --git a/cs/src/Ice/TcpTransceiver.cs b/cs/src/Ice/TcpTransceiver.cs
index 3c856b2d0c2..249cdc08c3e 100644
--- a/cs/src/Ice/TcpTransceiver.cs
+++ b/cs/src/Ice/TcpTransceiver.cs
@@ -32,9 +32,22 @@ namespace IceInternal
}
else if(_state <= StateConnectPending)
{
- Network.doFinishConnect(_fd, timeout);
- _state = StateConnected;
- _desc = Network.fdToString(_fd);
+ try
+ {
+ Network.doFinishConnect(_fd, timeout);
+ _state = StateConnected;
+ _desc = Network.fdToString(_fd);
+ }
+ catch(Ice.LocalException ex)
+ {
+ if(_traceLevels.network >= 2)
+ {
+ string s = "failed to establish tcp connection\n" + _desc + "\n" + ex;
+ _logger.trace(_traceLevels.networkCat, s);
+ }
+ throw ex;
+ }
+
if(_traceLevels.network >= 1)
{
string s = "tcp connection established\n" + _desc;
diff --git a/java/src/IceInternal/TcpConnector.java b/java/src/IceInternal/TcpConnector.java
index ab2a2a877e3..e42057940bb 100644
--- a/java/src/IceInternal/TcpConnector.java
+++ b/java/src/IceInternal/TcpConnector.java
@@ -20,19 +20,31 @@ final class TcpConnector implements Connector, java.lang.Comparable
_logger.trace(_traceLevels.networkCat, s);
}
- java.nio.channels.SocketChannel fd = Network.createTcpSocket();
- Network.setBlock(fd, false);
- Network.setTcpBufSize(fd, _instance.initializationData().properties, _logger);
- boolean connected = Network.doConnect(fd, _addr, timeout);
- if(connected)
+ try
+ {
+ java.nio.channels.SocketChannel fd = Network.createTcpSocket();
+ Network.setBlock(fd, false);
+ Network.setTcpBufSize(fd, _instance.initializationData().properties, _logger);
+ boolean connected = Network.doConnect(fd, _addr, timeout);
+ if(connected)
+ {
+ if(_traceLevels.network >= 1)
+ {
+ String s = "tcp connection established\n" + Network.fdToString(fd);
+ _logger.trace(_traceLevels.networkCat, s);
+ }
+ }
+ return new TcpTransceiver(_instance, fd, connected);
+ }
+ catch(Ice.LocalException ex)
{
- if(_traceLevels.network >= 1)
+ if(_traceLevels.network >= 2)
{
- String s = "tcp connection established\n" + Network.fdToString(fd);
+ String s = "failed to establish tcp connection to " + toString() + "\n" + ex;
_logger.trace(_traceLevels.networkCat, s);
}
+ throw ex;
}
- return new TcpTransceiver(_instance, fd, connected);
}
public short
diff --git a/java/src/IceInternal/TcpTransceiver.java b/java/src/IceInternal/TcpTransceiver.java
index bfa7c3ced27..82e46ec2552 100644
--- a/java/src/IceInternal/TcpTransceiver.java
+++ b/java/src/IceInternal/TcpTransceiver.java
@@ -28,9 +28,22 @@ final class TcpTransceiver implements Transceiver
}
else if(_state <= StateConnectPending)
{
- Network.doFinishConnect(_fd, timeout);
- _state = StateConnected;
- _desc = Network.fdToString(_fd);
+ try
+ {
+ Network.doFinishConnect(_fd, timeout);
+ _state = StateConnected;
+ _desc = Network.fdToString(_fd);
+ }
+ catch(Ice.LocalException ex)
+ {
+ if(_traceLevels.network >= 2)
+ {
+ String s = "failed to establish tcp connection\n" + _desc + "\n" + ex;
+ _logger.trace(_traceLevels.networkCat, s);
+ }
+ throw ex;
+ }
+
if(_traceLevels.network >= 1)
{
String s = "tcp connection established\n" + _desc;
diff --git a/java/src/IceSSL/ConnectorI.java b/java/src/IceSSL/ConnectorI.java
index e2d25283302..97ed91e9939 100644
--- a/java/src/IceSSL/ConnectorI.java
+++ b/java/src/IceSSL/ConnectorI.java
@@ -30,19 +30,30 @@ final class ConnectorI implements IceInternal.Connector, java.lang.Comparable
_logger.trace(_instance.networkTraceCategory(), s);
}
- java.nio.channels.SocketChannel fd = IceInternal.Network.createTcpSocket();
- IceInternal.Network.setBlock(fd, false);
- IceInternal.Network.setTcpBufSize(fd, _instance.communicator().getProperties(), _logger);
- boolean connected = IceInternal.Network.doConnect(fd, _addr, timeout);
-
try
{
- javax.net.ssl.SSLEngine engine = _instance.createSSLEngine(false);
- return new TransceiverI(_instance, engine, fd, _host, connected, false, "");
+ java.nio.channels.SocketChannel fd = IceInternal.Network.createTcpSocket();
+ IceInternal.Network.setBlock(fd, false);
+ IceInternal.Network.setTcpBufSize(fd, _instance.communicator().getProperties(), _logger);
+ boolean connected = IceInternal.Network.doConnect(fd, _addr, timeout);
+ try
+ {
+ javax.net.ssl.SSLEngine engine = _instance.createSSLEngine(false);
+ return new TransceiverI(_instance, engine, fd, _host, connected, false, "");
+ }
+ catch(RuntimeException ex)
+ {
+ IceInternal.Network.closeSocketNoThrow(fd);
+ throw ex;
+ }
}
- catch(RuntimeException ex)
+ catch(Ice.LocalException ex)
{
- IceInternal.Network.closeSocketNoThrow(fd);
+ if(_instance.networkTraceLevel() >= 2)
+ {
+ String s = "failed to establish ssl connection to " + toString() + "\n" + ex;
+ _logger.trace(_instance.networkTraceCategory(), s);
+ }
throw ex;
}
}
diff --git a/java/src/IceSSL/TransceiverI.java b/java/src/IceSSL/TransceiverI.java
index 97ce62c558c..0d56e6f5a83 100644
--- a/java/src/IceSSL/TransceiverI.java
+++ b/java/src/IceSSL/TransceiverI.java
@@ -28,36 +28,48 @@ final class TransceiverI implements IceInternal.Transceiver
public synchronized IceInternal.SocketStatus
initialize(int timeout)
{
- if(_state == StateNeedConnect && timeout == 0)
- {
- _state = StateConnectPending;
- return IceInternal.SocketStatus.NeedConnect;
- }
- else if(_state <= StateConnectPending)
- {
- IceInternal.Network.doFinishConnect(_fd, timeout);
- _state = StateConnected;
- _desc = IceInternal.Network.fdToString(_fd);
- }
- assert(_state == StateConnected);
-
- IceInternal.SocketStatus status;
- do
+ try
{
- status = handshakeNonBlocking();
- if(timeout == 0)
+ if(_state == StateNeedConnect && timeout == 0)
+ {
+ _state = StateConnectPending;
+ return IceInternal.SocketStatus.NeedConnect;
+ }
+ else if(_state <= StateConnectPending)
{
- return status;
+ IceInternal.Network.doFinishConnect(_fd, timeout);
+ _state = StateConnected;
+ _desc = IceInternal.Network.fdToString(_fd);
}
+ assert(_state == StateConnected);
- if(status != IceInternal.SocketStatus.Finished)
+ IceInternal.SocketStatus status;
+ do
{
- handleSocketStatus(status, timeout);
+ status = handshakeNonBlocking();
+ if(timeout == 0)
+ {
+ return status;
+ }
+
+ if(status != IceInternal.SocketStatus.Finished)
+ {
+ handleSocketStatus(status, timeout);
+ }
}
+ while(status != IceInternal.SocketStatus.Finished);
+ }
+ catch(Ice.LocalException ex)
+ {
+ if(_instance.networkTraceLevel() >= 2)
+ {
+ String s = "failed to establish ssl connection\n" + _desc + "\n" + ex;
+ _logger.trace(_instance.networkTraceCategory(), s);
+ }
+ throw ex;
}
- while(status != IceInternal.SocketStatus.Finished);
- return status;
+ return IceInternal.SocketStatus.Finished;
}
//