diff options
author | Mark Spruiell <mes@zeroc.com> | 2002-11-19 23:31:49 +0000 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2002-11-19 23:31:49 +0000 |
commit | 3a8bf28738963fc85e29d6c009db306a558bd918 (patch) | |
tree | f1880d0da0dc746acd43b586f5ce662ccff50c26 /java/src | |
parent | more info (diff) | |
download | ice-3a8bf28738963fc85e29d6c009db306a558bd918.tar.bz2 ice-3a8bf28738963fc85e29d6c009db306a558bd918.tar.xz ice-3a8bf28738963fc85e29d6c009db306a558bd918.zip |
adding Network.getLocalAddress
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/Ice/Util.java | 11 | ||||
-rw-r--r-- | java/src/IceInternal/Network.java | 58 |
2 files changed, 50 insertions, 19 deletions
diff --git a/java/src/Ice/Util.java b/java/src/Ice/Util.java index 8a62d9ffec1..d15bf89ba6c 100644 --- a/java/src/Ice/Util.java +++ b/java/src/Ice/Util.java @@ -199,15 +199,8 @@ public final class Util if(_localAddress == null) { - java.net.InetAddress addr = null; - try - { - addr = java.net.InetAddress.getLocalHost(); - } - catch(java.net.UnknownHostException ex) - { - throw new DNSException(); - } + java.net.InetAddress addr = IceInternal.Network.getLocalAddress(); + byte[] ip = addr.getAddress(); _localAddress = ""; for(int i = 0; i < ip.length; i++) diff --git a/java/src/IceInternal/Network.java b/java/src/IceInternal/Network.java index 71b16bfcf95..9467a9cdb40 100644 --- a/java/src/IceInternal/Network.java +++ b/java/src/IceInternal/Network.java @@ -381,25 +381,63 @@ public final class Network public static String getLocalHost(boolean numeric) { - String host; + java.net.InetAddress addr = getLocalAddress(); + + return numeric ? addr.getHostAddress() : addr.getHostName(); + } + + public static java.net.InetAddress + getLocalAddress() + { + java.net.InetAddress addr = null; try { - if(!numeric) + addr = java.net.InetAddress.getLocalHost(); + } + catch(java.net.UnknownHostException ex) + { + // + // UnknownHostException may be raised on DHCP systems, so + // we iterate over the network interfaces and pick an IP + // address (preferably not the loopback address). + // + java.net.InetAddress loopback = null; + try + { + java.util.Enumeration ni = java.net.NetworkInterface.getNetworkInterfaces(); + while(addr == null && ni.hasMoreElements()) + { + java.net.NetworkInterface i = (java.net.NetworkInterface)ni.nextElement(); + java.util.Enumeration addrs = i.getInetAddresses(); + while(addr == null && addrs.hasMoreElements()) + { + java.net.InetAddress a = (java.net.InetAddress)addrs.nextElement(); + if(!a.isLoopbackAddress()) + { + addr = a; + } + else + { + loopback = a; + } + } + } + } + catch(java.net.SocketException e) { - host = java.net.InetAddress.getLocalHost().getHostName(); + Ice.SocketException se = new Ice.SocketException(); + se.initCause(ex); + throw se; } - else + + if(addr == null) { - host = java.net.InetAddress.getLocalHost().getHostAddress(); + addr = loopback; // Use the loopback address as the last resort. } } - catch(java.net.UnknownHostException ex) - { - throw new Ice.DNSException(); - } - return host; + return addr; } public static final class SocketPair |