2012-03-04 11 views
8

Estoy tratando de averiguar si se pueden alcanzar hosts específicos en mi red. Mi código de Java es la siguiente:Java InetAddress.isReachable() timeout

InetAddress adr = InetAddress.getByName(host); 
if(adr.isReachable(3000)){ 
    System.out.println(host + " is reachable"); 
} 

Esto funciona bastante bien, sin embargo, si me baja el tiempo de espera de 500 ms en lugar de decir, no va a designar el host 'alcanzable más. Planeo verificar bastantes hosts en un bucle, por lo que tener un tiempo de espera bajo es bastante importante. Si hago ping al host manualmente desde la línea de comandos de Windows, toma menos de 10 ms.

Entonces, ¿por qué el método Java necesita un tiempo de espera mucho mayor para tener éxito? ¿Hay alguna alternativa al uso de isReachable()?

Respuesta

5

Depende de lo que quiere decir con la accesibilidad. Si solo encuentra hosts alcanzables que escuchan en puertos específicos, puede abrir una conexión de socket a ese puerto (por ejemplo, encontrar todos los servidores HTTP revisando el puerto 80). Usar InetAddress.isReachable() depende de la implementación. Según el javadoc, "una implementación típica usará PETICIONES DE ECO de ICMP". Una verificación de "puerto conocido" (como http (80), smb (445), etc.) usando Java NIO (E/S no bloqueante) puede tener un mayor rendimiento. Mi compañía tiene un producto que usa un escaneo de "puerto conocido" para encontrar cajas que ejecutan Telnet o SSH, usando NIO, y podemos escanear alrededor de 5000 IP/seg.

+0

Gracias, Esencialmente sí, me gustaría conectarme/verificar los hosts en el puerto 10001 que utilizan los dispositivos que necesito encontrar. ¿Podría dar un ejemplo de cómo implementar esa verificación de puerto conocida? – Jerome

+1

Bueno, no paso a implementar un método de E/S sin bloqueo (NIO). Pero yo diría simplemente crear un zócalo. Cree un SocketAddress con la IP de destino y el puerto 10001. Luego llame a socket.connect (SocketAddress, timeout) con el tiempo de espera apropiado. Captura TimeOutException. Si el socket.connect() regresa sin excepción, cierre el socket, usted sabe que el dispositivo está escuchando en 10001. Para un modelo de NIO, eche un vistazo al proyecto de código abierto de Netty y ejemplos. – brettw