2012-08-03 16 views
7

En Java, me gustaría encontrar que java.net.NetworkInterface correspondiente a la interfaz utilizada llegue a la puerta de enlace predeterminada. Los nombres de las interfaces, etc., no se conocen con anticipación.Interfaz de red de búsqueda de Java para la puerta de enlace predeterminada

En otras palabras-, si el siguiente fue mi tabla de enrutamiento, me gustaría que la interfaz correspondiente con "bond0":

$ netstat -r 
Kernel IP routing table 
Destination  Gateway   Genmask   Flags MSS Window irtt Iface 
10.10.10.0  *    255.255.255.0 U   0 0   0 bond0 
10.10.11.0  *    255.255.255.0 U   0 0   0 eth2 
10.10.11.0  *    255.255.255.0 U   0 0   0 eth3 
10.10.12.0  *    255.255.255.0 U   0 0   0 eth4 
10.10.13.0  *    255.255.255.0 U   0 0   0 eth5 
default   mygateway  0.0.0.0   UG  0 0   0 bond0 

Después de hacer algunas búsquedas Google, todavía no he encontrado ninguna respuesta.

edición:
El tiempo de ejecución de Java debe "saber" cómo obtener esta información (por no decir que es expuesta). Al unir un java.net.MulticastSocket a un grupo de multidifusión usando la llamada join (InetAddress grpAddr) (que no especifica una interfaz), el comportamiento aparente parece ser unirse a la interfaz "predeterminada" (como se define arriba). Esto funciona incluso cuando el intf predeterminado no es la primera interfaz enumerada en la tabla de enrutamiento. Sin embargo, la llamada POSIX subyacente que se une a un grupo mcast requiere esta información !:

struct ip_mreqn group; 
group.imr_multiaddr = ... 
group.imr_address = **address of the interface!** 
setsockopty(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &group, sizeof(group)); 

El punto: proporcionando un método para unirse a un grupo de multidifusión que no requiere la intf, la plataforma Java, implícitamente , debe saber cómo determinar el intf apropiado en cada plataforma.

Respuesta

0

Por lo que yo sé, no habrá una buena manera de hacerlo, porque tales detalles de bajo nivel son muy difíciles de implementar para Java de forma multiplataforma. java.net.NetworkInterface puede ayudar un poco, pero si los métodos disponibles no son suficientes, es posible que tenga que recurrir a algo un poco más feo.

¿Esto es algo que se ejecutará en una plataforma específica para siempre, o necesita ser más portátil? En el peor de los casos, podría intentar ejecutar un comando del sistema y analizar el resultado, pero esto no es muy portátil o estable.

Algunos temas relacionados:

Is it possible to get the default gateway IP and MAC addresses in java?

Finding SSID of a wireless network with Java

+0

ver la edición anterior ... – Josh

+0

Bien, veo tu punto. Sin embargo, parece que esa llamada aún requiere una dirección, ¿sí? java.net.NetworkInterface puede obtener las interfaces (y sus direcciones), y un poco de astucia puede decidir cuál posee la dirección dada. Creo que su problema es más complejo, porque primero busca información de enrutamiento de nivel inferior y luego hacia atrás para encontrar una interfaz asociada a la ruta (predeterminada). – Carl

+0

Requiere la dirección de multidifusión (es decir, dirección especial en 224.xxx-239.xxx), no la dirección de la interfaz. No se proporciona tal información en los argumentos. Entonces, el problema que debe resolver la llamada "unirse" es el mismo. Escoge mágicamente el que tiene la ruta predeterminada (comportamiento aparente). Del mismo modo, quiero saber qué interfaz tiene la ruta predeterminada. – Josh

4

Mi manera es:

try(DatagramSocket s=new DatagramSocket()) 
{ 
    s.connect(InetAddress.getByAddress(new byte[]{1,1,1,1}), 0); 
    return NetworkInterface.getByInetAddress(s.getLocalAddress()).getHardwareAddress(); 
} 

debido al uso de datagramas (UDP), que no se conecta a ninguna parte, así que el puerto el número puede no tener sentido y la dirección remota (1.1.1.1) no necesita ser accesible, solo enrutable.

+0

en mi experiencia esto no funciona con Windows e IPv6. getLocalAddress devuelve una dirección v4 falsa a pesar de estar vinculada como un socket v6 – the8472

+0

Este código solo muestra la dirección MAC. – Razavi

+0

Funciona para mí con Microsoft-android-emulator, acoplador y OpenVPN en Windows10 y Hyper-V habilitado. – AlexS

Cuestiones relacionadas