/* * @(#)NetworkInterface.java 1.17 04/05/05 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.net; import java.net.SocketException; import java.util.Enumeration; import java.util.NoSuchElementException; import sun.security.action.*; import java.security.AccessController; /** * This class represents a Network Interface made up of a name, * and a list of IP addresses assigned to this interface. * It is used to identify the local interface on which a multicast group * is joined. * * Interfaces are normally known by names such as "le0". * * @since 1.4 */ public final class NetworkInterface { private String name; private String displayName; private int index; private InetAddress addrs[]; static { AccessController.doPrivileged(new LoadLibraryAction("net")); init(); } /** * Returns an NetworkInterface object with index set to 0 and name to null. * Setting such an interface on a MulticastSocket will cause the * kernel to choose one interface for sending multicast packets. * */ NetworkInterface() { } NetworkInterface(String name, int index, InetAddress[] addrs) { this.name = name; this.index = index; this.addrs = addrs; } /** * Get the name of this network interface. * * @return the name of this network interface */ public String getName() { return name; } /** * Convenience method to return an Enumeration with all or a * subset of the InetAddresses bound to this network interface. *
* If there is a security manager, its
* If the specified IP address is bound to multiple network
* interfaces it is not defined which network interface is
* returned.
*
* @param addr
* The InetAddress to search with.
*
* @return A NetworkInterface
* or null if there is no network interface
* with the specified IP address.
*
* @throws SocketException
* If an I/O error occurs.
*
* @throws NullPointerException
* If the specified address is null.
*/
public static NetworkInterface getByInetAddress(InetAddress addr) throws SocketException {
if (addr == null)
throw new NullPointerException();
return getByInetAddress0(addr);
}
/**
* Returns all the interfaces on this machine. Returns null if no
* network interfaces could be found on this machine.
*
* NOTE: can use getNetworkInterfaces()+getInetAddresses()
* to obtain all IP addresses for this node
*
* @return an Enumeration of NetworkInterfaces found on this machine
* @exception SocketException if an I/O error occurs.
*/
public static Enumeration
* Two instances of checkConnect
* method is called for each InetAddress. Only InetAddresses where
* the checkConnect
doesn't throw a SecurityException
* will be returned in the Enumeration.
* @return an Enumeration object with all or a subset of the InetAddresses
* bound to this network interface
*/
public Enumerationtrue
if and only if the argument is
* not null
and it represents the same NetworkInterface
* as this object.
* NetworkInterface
represent the same
* NetworkInterface if both name and addrs are the same for both.
*
* @param obj the object to compare against.
* @return true
if the objects are the same;
* false
otherwise.
* @see java.net.InetAddress#getAddress()
*/
public boolean equals(Object obj) {
if ((obj == null) || !(obj instanceof NetworkInterface)) {
return false;
}
NetworkInterface netIF = (NetworkInterface)obj;
if (name != null ) {
if (netIF.getName() != null) {
if (!name.equals(netIF.getName())) {
return false;
}
} else {
return false;
}
} else {
if (netIF.getName() != null) {
return false;
}
}
Enumeration newAddrs = netIF.getInetAddresses();
int i = 0;
for (i = 0; newAddrs.hasMoreElements();newAddrs.nextElement(), i++);
if (addrs == null) {
if (i != 0) {
return false;
}
} else {
/*
* Compare number of addresses (in the checked subset)
*/
int count = 0;
Enumeration e = getInetAddresses();
for (; e.hasMoreElements(); count++) {
e.nextElement();
}
if (i != count) {
return false;
}
}
newAddrs = netIF.getInetAddresses();
for (; newAddrs.hasMoreElements();) {
boolean equal = false;
Enumeration thisAddrs = getInetAddresses();
InetAddress newAddr = (InetAddress)newAddrs.nextElement();
for (; thisAddrs.hasMoreElements();) {
InetAddress thisAddr = (InetAddress)thisAddrs.nextElement();
if (thisAddr.equals(newAddr)) {
equal = true;
}
}
if (!equal) {
return false;
}
}
return true;
}
public int hashCode() {
int count = 0;
if (addrs != null) {
for (int i = 0; i < addrs.length; i++) {
count += addrs[i].hashCode();
}
}
return count;
}
public String toString() {
String result = "name:";
result += name == null? "null": name;
if (displayName != null) {
result += " (" + displayName + ")";
}
result += " index: "+index+" addresses:\n";
for (Enumeration e = getInetAddresses(); e.hasMoreElements(); ) {
InetAddress addr = (InetAddress)e.nextElement();
result += addr+";\n";
}
return result;
}
private static native void init();
}