< prev index next >
src/java.base/macosx/classes/java/net/DefaultInterface.java
Print this page
rev 16951 : [mq]: defaultInterface
@@ -48,14 +48,15 @@
static NetworkInterface getDefault() {
return defaultInterface;
}
/**
- * Choose a default interface. This method returns an interface that is
- * both "up" and supports multicast. This method choses an interface in
+ * Choose a default interface. This method returns the first interface that
+ * is both "up" and supports multicast. This method chooses an interface in
* order of preference:
* 1. neither loopback nor point to point
+ * ( prefer interfaces with dual IP support )
* 2. point to point
* 3. loopback
*
* @return the chosen interface or {@code null} if there isn't a suitable
* default
@@ -64,34 +65,58 @@
Enumeration<NetworkInterface> nifs;
try {
nifs = NetworkInterface.getNetworkInterfaces();
} catch (IOException ignore) {
- // unable to enumate network interfaces
+ // unable to enumerate network interfaces
return null;
}
+ NetworkInterface preferred = null;
NetworkInterface ppp = null;
NetworkInterface loopback = null;
while (nifs.hasMoreElements()) {
NetworkInterface ni = nifs.nextElement();
try {
- if (ni.isUp() && ni.supportsMulticast()) {
+ if (!ni.isUp() || !ni.supportsMulticast())
+ continue;
+
+ boolean ip4 = false, ip6 = false;
+ Enumeration<InetAddress> addrs = ni.getInetAddresses();
+ while (addrs.hasMoreElements()) {
+ InetAddress addr = addrs.nextElement();
+ if (!addr.isAnyLocalAddress()) {
+ if (addr instanceof Inet4Address) {
+ ip4 = true;
+ } else if (addr instanceof Inet6Address) {
+ ip6 = true;
+ }
+ }
+ }
+
boolean isLoopback = ni.isLoopback();
boolean isPPP = ni.isPointToPoint();
if (!isLoopback && !isPPP) {
// found an interface that is not the loopback or a
// point-to-point interface
+ if (preferred == null) {
+ preferred = ni;
+ } else if (ip4 == true && ip6 == true){
return ni;
}
+ }
if (ppp == null && isPPP)
ppp = ni;
if (loopback == null && isLoopback)
loopback = ni;
- }
+
} catch (IOException skip) { }
}
+ if (preferred != null) {
+ return preferred;
+ } else {
return (ppp != null) ? ppp : loopback;
}
+ }
}
< prev index next >