2011-08-19 18 views
7

Existe una API (NetworkInterface, InetAddress, etc) en Java con la que puedo detectar que una tarjeta de red no está conectada.¿Cómo puedo detectar si una tarjeta de red no está conectada con Java sin demora?

El problema es que el direccionamiento de algunas de las API de la red tiene un gran tiempo de espera. Pero si la tarjeta de red no está conectada a ningún cable, entonces podemos saltearla. El problema sólo parece ocurrir con Windows 7.

+0

Muchos de los ajustes de tiempo de espera se pueden controlar a nivel de JVM (ver la respuesta de Snicolas). Otros, tienes que configurarlos en el nivel del sistema operativo, y tienes que convertirlos en una "condición previa" del nivel del sistema operativo para tu aplicación java. Tal vez estoy malinterpretando su problema, pero me parece que en algún momento, su implementación de JVM 'debe' hacer algunas suposiciones sobre lo que está siendo provisto por el sistema operativo subyacente. Buena pregunta (+1 para ti). –

Respuesta

1

Se podía utilizar algunas propiedades del sistema Java para configurar el tiempo de espera predeterminado para la conexión de un conector usando

sun.net.client.defaultConnectTimeout 

(all properties here)

pero parece Para mí, comprobar si está presente o no un controlador de acceso de medio específico es el trabajo del sistema operativo subyacente. No puedo contar mucho sobre Windows 7, obtuve un buen sistema operativo desde hace 12 años (Linux).

Saludos, Stéphane

+0

Estoy de acuerdo con usted en esto (que esta es una tarea de nivel de sistema operativo, no una de JVM). OTH, uno podría hacer el caso de tratar de hacer esto en el nivel de JVM si uno está implementando un contenedor o marco (donde las líneas entre las expectativas de nivel de aplicación y de nivel de sistema se vuelven borrosas.) –

+0

No creo que cambiar el tiempo de espera sea útil. Si lo haces demasiado corto, se agotará el tiempo de espera cuando haya un retraso de conexión real. Pero existen circunstancias (como no tener una tarjeta de red) cuando no se puede establecer una conexión de red, y el interlocutor quiere detectarlo de inmediato. – DJClayworth

2

que tenían el mismo problema. Terminé usando esto:

Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces(); 
     while(eni.hasMoreElements()) { 
      Enumeration<InetAddress> eia = eni.nextElement().getInetAddresses(); 
      while(eia.hasMoreElements()) { 
       InetAddress ia = eia.nextElement(); 
       if (!ia.isAnyLocalAddress() && !ia.isLoopbackAddress() && !ia.isSiteLocalAddress()) { 
        if (!ia.getHostName().equals(ia.getHostAddress())) 
         return true; 
       } 
      } 
     } 

Funciona con Java 5+. También verifica indirectamente DNS (comparando nombres/direcciones).

+0

El problema es que getHostName() bloquea durante unos 5 segundos si el carro de red no está conectado. – Horcrux7

+0

No es para mí. Si no está conectado, el nombre de host es el mismo que el de la dirección de host. EDITAR: una vez más, estoy comprobando una pila de IPv6, por lo que no estoy seguro sobre el comportamiento de IPv4 ... Sin embargo, creo que sería lo mismo. – BenCole

Cuestiones relacionadas