diff --git a/java/src/IceInternal/Network.java b/java/src/IceInternal/Network.java index 69546f3..73ed7df 100644 --- a/java/src/IceInternal/Network.java +++ b/java/src/IceInternal/Network.java @@ -123,6 +123,7 @@ public final class Network java.net.Socket socket = fd.socket(); socket.setTcpNoDelay(true); socket.setKeepAlive(true); + socket.bind(null); return fd; } catch(java.io.IOException ex) @@ -1088,31 +1089,24 @@ public final class Network return ""; } - java.net.InetAddress localAddr = null, remoteAddr = null; - int localPort = -1, remotePort = -1; + String result = null; if(fd instanceof java.nio.channels.SocketChannel) { java.net.Socket socket = ((java.nio.channels.SocketChannel)fd).socket(); - localAddr = socket.getLocalAddress(); - localPort = socket.getLocalPort(); - remoteAddr = socket.getInetAddress(); - remotePort = socket.getPort(); + result = fdToString(socket); } else if(fd instanceof java.nio.channels.DatagramChannel) { java.net.DatagramSocket socket = ((java.nio.channels.DatagramChannel)fd).socket(); - localAddr = socket.getLocalAddress(); - localPort = socket.getLocalPort(); - remoteAddr = socket.getInetAddress(); - remotePort = socket.getPort(); + result = fdToString(socket); } else { assert(false); } - return addressesToString(localAddr, localPort, remoteAddr, remotePort); + return result; } public static String @@ -1123,12 +1117,27 @@ public final class Network return ""; } - java.net.InetAddress localAddr = fd.getLocalAddress(); - int localPort = fd.getLocalPort(); - java.net.InetAddress remoteAddr = fd.getInetAddress(); - int remotePort = fd.getPort(); + java.net.InetSocketAddress localAddr = + fd.isBound() ? (java.net.InetSocketAddress)fd.getLocalSocketAddress() : null; + java.net.InetSocketAddress remoteAddr = + fd.isConnected() ? (java.net.InetSocketAddress)fd.getRemoteSocketAddress() : null; + + return addressesToString(localAddr, remoteAddr); + } + + public static String + fdToString(java.net.DatagramSocket fd) + { + if(fd == null) + { + return ""; + } + + java.net.InetSocketAddress localAddr = + fd.isBound() ? (java.net.InetSocketAddress)fd.getLocalSocketAddress() : null; + java.net.InetSocketAddress remoteAddr = (java.net.InetSocketAddress)fd.getRemoteSocketAddress(); - return addressesToString(localAddr, localPort, remoteAddr, remotePort); + return addressesToString(localAddr, remoteAddr); } public static String @@ -1136,22 +1145,28 @@ public final class Network { StringBuffer s = new StringBuffer(); s.append("local address = "); - s.append(localAddr.getHostAddress()); - s.append(':'); - s.append(localPort); - if(remoteAddr == null) + s.append(addrToString(localAddr, localPort)); + s.append("\nremote address = "); + s.append(addrToString(remoteAddr, remotePort)); + return s.toString(); + } + + public static String + addressesToString(java.net.InetSocketAddress localAddr, java.net.InetSocketAddress remoteAddr) + { + java.net.InetAddress la = null, ra = null; + int lp = 0, rp = 0; + if(localAddr != null) { - s.append("\nremote address = "); + la = localAddr.getAddress(); + lp = localAddr.getPort(); } - else + if(remoteAddr != null) { - s.append("\nremote address = "); - s.append(remoteAddr.getHostAddress()); - s.append(':'); - s.append(remotePort); + ra = remoteAddr.getAddress(); + rp = remoteAddr.getPort(); } - - return s.toString(); + return addressesToString(la, lp, ra, rp); } public static String @@ -1172,6 +1187,29 @@ public final class Network ex.getMessage().indexOf("A system call received an interrupt") >= 0; // AIX JDK 1.4.2 } + private static String + addrToString(java.net.InetAddress addr, int port) + { + StringBuffer s = new StringBuffer(); + + if(addr == null || addr.isAnyLocalAddress()) + { + s.append(""); + } + else + { + s.append(addr.getHostAddress()); + } + + if(port > 0) + { + s.append(':'); + s.append(port); + } + + return s.toString(); + } + private static java.net.InetSocketAddress getAddressImpl(String host, int port, int protocol, boolean server) { diff --git a/java/src/IceInternal/TcpTransceiver.java b/java/src/IceInternal/TcpTransceiver.java index 4fbe8fa..9cfcf32 100644 --- a/java/src/IceInternal/TcpTransceiver.java +++ b/java/src/IceInternal/TcpTransceiver.java @@ -58,7 +58,13 @@ final class TcpTransceiver implements Transceiver assert(_fd != null); _state = StateConnected; - _desc = Network.fdToString(_fd); + // + // TODO: Android bug 3123 prevents us from obtaining a useful description + // of the remote socket address after we have set socket options. We'll use + // the original target address until this bug is fixed. + // + //_desc = Network.fdToString(_fd); + _desc = Network.addressesToString((java.net.InetSocketAddress)_fd.socket().getLocalSocketAddress(), _addr); if(_traceLevels.network >= 1) { @@ -357,7 +363,7 @@ final class TcpTransceiver implements Transceiver _traceLevels = instance.traceLevels(); _logger = instance.initializationData().logger; _stats = instance.initializationData().stats; - _desc = Network.addressesToString(_addr.getAddress(), 0, null, 0); + _desc = Network.fdToString(_fd); _state = StateNeedConnect; } diff --git a/java/src/IceSSL/TransceiverI.java b/java/src/IceSSL/TransceiverI.java index 6f8d672..2afc84f 100644 --- a/java/src/IceSSL/TransceiverI.java +++ b/java/src/IceSSL/TransceiverI.java @@ -680,7 +680,9 @@ final class TransceiverI implements IceInternal.Transceiver } _incomingfd = fd; - // Set temporary desc. + // + // Set temporary description. + // _desc = Network.fdToString(_incomingfd); } @@ -706,7 +708,10 @@ final class TransceiverI implements IceInternal.Transceiver // Ignore. } - _desc = Network.addressesToString(_addr.getAddress(), 0, null, 0); + // + // Set temporary description. + // + _desc = Network.addressesToString(null, 0, null, 0); } protected void