summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rw-r--r--java/src/Ice/Util.java11
-rw-r--r--java/src/IceInternal/Network.java58
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