diff --git a/java/src/IceInternal/TcpConnector.java b/java/src/IceInternal/TcpConnector.java index 2598123..433acca 100644 --- a/java/src/IceInternal/TcpConnector.java +++ b/java/src/IceInternal/TcpConnector.java @@ -26,8 +26,13 @@ final class TcpConnector implements Connector Network.setBlock(fd, false); Network.setTcpBufSize(fd, _instance.initializationData().properties, _logger); final java.net.InetSocketAddress addr = _proxy != null ? _proxy.getAddress() : _addr; - Network.doConnect(fd, addr); - return new TcpTransceiver(_instance, fd, _proxy, _addr); + boolean connected = Network.doConnect(fd, addr); + if(connected && _traceLevels.network >= 1) + { + String s = "tcp connection established\n" + Network.fdToString(fd); + _logger.trace(_traceLevels.networkCat, s); + } + return new TcpTransceiver(_instance, fd, connected, _proxy, _addr); } catch(Ice.LocalException ex) { diff --git a/java/src/IceInternal/TcpTransceiver.java b/java/src/IceInternal/TcpTransceiver.java index 0f451b9..14da55a 100644 --- a/java/src/IceInternal/TcpTransceiver.java +++ b/java/src/IceInternal/TcpTransceiver.java @@ -21,6 +21,7 @@ final class TcpTransceiver implements Transceiver public int initialize(Buffer readBuffer, Buffer writeBuffer) { + boolean wasConnected = false; try { if(_state == StateNeedConnect) @@ -28,9 +29,16 @@ final class TcpTransceiver implements Transceiver _state = StateConnectPending; return SocketOperation.Connect; } - else if(_state == StateConnectPending) + else if(_state == StateConnectPending || _state == StateConnectedUnitialized) { - Network.doFinishConnect(_fd); + if(_state == StateConnectPending) + { + Network.doFinishConnect(_fd); + } + else + { + wasConnected = true; + } _desc = Network.fdToString(_fd, _proxy, _addr); if(_proxy != null) @@ -114,7 +122,7 @@ final class TcpTransceiver implements Transceiver } assert(_state == StateConnected); - if(_traceLevels.network >= 1) + if(!wasConnected && _traceLevels.network >= 1) { String s = "tcp connection established\n" + _desc; _logger.trace(_traceLevels.networkCat, s); @@ -323,7 +331,7 @@ final class TcpTransceiver implements Transceiver } @SuppressWarnings("deprecation") - TcpTransceiver(Instance instance, java.nio.channels.SocketChannel fd, NetworkProxy proxy, + TcpTransceiver(Instance instance, java.nio.channels.SocketChannel fd, boolean connected, NetworkProxy proxy, java.net.InetSocketAddress addr) { _fd = fd; @@ -332,7 +340,7 @@ final class TcpTransceiver implements Transceiver _traceLevels = instance.traceLevels(); _logger = instance.initializationData().logger; _stats = instance.initializationData().stats; - _state = StateNeedConnect; + _state = connected ? StateConnectedUnitialized : StateNeedConnect; _desc = ""; _maxSendPacketSize = 0; @@ -408,7 +416,8 @@ final class TcpTransceiver implements Transceiver private static final int StateNeedConnect = 0; private static final int StateConnectPending = 1; - private static final int StateProxyConnectRequest = 2; - private static final int StateProxyConnectRequestPending = 3; - private static final int StateConnected = 4; + private static final int StateConnectedUnitialized = 2; + private static final int StateProxyConnectRequest = 3; + private static final int StateProxyConnectRequestPending = 4; + private static final int StateConnected = 5; } diff --git a/java/src/IceSSL/ConnectorI.java b/java/src/IceSSL/ConnectorI.java index 788287c..3e9f463 100644 --- a/java/src/IceSSL/ConnectorI.java +++ b/java/src/IceSSL/ConnectorI.java @@ -36,11 +36,11 @@ final class ConnectorI implements IceInternal.Connector IceInternal.Network.setBlock(fd, false); IceInternal.Network.setTcpBufSize(fd, _instance.communicator().getProperties(), _logger); final java.net.InetSocketAddress addr = _proxy != null ? _proxy.getAddress() : _addr; - IceInternal.Network.doConnect(fd, addr); + boolean connected = IceInternal.Network.doConnect(fd, addr); try { javax.net.ssl.SSLEngine engine = _instance.createSSLEngine(false, _addr); - return new TransceiverI(_instance, engine, fd, _proxy, _host, _addr); + return new TransceiverI(_instance, engine, fd, connected, _proxy, _host, _addr); } catch(RuntimeException ex) { diff --git a/java/src/IceSSL/TransceiverI.java b/java/src/IceSSL/TransceiverI.java index 09435e1..58e714c 100644 --- a/java/src/IceSSL/TransceiverI.java +++ b/java/src/IceSSL/TransceiverI.java @@ -32,9 +32,12 @@ final class TransceiverI implements IceInternal.Transceiver _state = StateConnectPending; return IceInternal.SocketOperation.Connect; } - else if(_state == StateConnectPending) + else if(_state == StateConnectPending || _state == StateConnectedUnitialized) { - IceInternal.Network.doFinishConnect(_fd); + if(_state == StateConnectPending) + { + IceInternal.Network.doFinishConnect(_fd); + } _desc = IceInternal.Network.fdToString(_fd, _proxy, _addr); if(_proxy != null) @@ -379,14 +382,14 @@ final class TransceiverI implements IceInternal.Transceiver } TransceiverI(Instance instance, javax.net.ssl.SSLEngine engine, java.nio.channels.SocketChannel fd, - IceInternal.NetworkProxy proxy, String host, java.net.InetSocketAddress addr) + boolean connected, IceInternal.NetworkProxy proxy, String host, java.net.InetSocketAddress addr) { init(instance, engine, fd); _proxy = proxy; _host = host; _incoming = false; _addr = addr; - _state = StateNeedConnect; + _state = connected ? StateConnectedUnitialized : StateNeedConnect; _desc = IceInternal.Network.fdToString(_fd, _proxy, _addr); } @@ -1024,8 +1027,9 @@ final class TransceiverI implements IceInternal.Transceiver private static final int StateNeedConnect = 0; private static final int StateConnectPending = 1; - private static final int StateProxyConnectRequest = 2; - private static final int StateProxyConnectRequestPending = 3; - private static final int StateConnected = 4; - private static final int StateHandshakeComplete = 5; + private static final int StateConnectedUnitialized = 2; + private static final int StateProxyConnectRequest = 3; + private static final int StateProxyConnectRequestPending = 4; + private static final int StateConnected = 5; + private static final int StateHandshakeComplete = 6; }