java clojure ping inetaddress

isReachable en Java no parece funcionar del modo en que se supone que es



clojure ping (2)

Estoy usando Clojure, pero puedo leer Java, así que esta no es una pregunta específica de Clojure. Esto ni siquiera parece funcionar desde Java.

Estoy tratando de implementar un poco de una función ''ping'' usando isReachable. El código que estoy usando es este:

(.isReachable (java.net.InetAddress/getByName "www.microsoft.com") 5000)

Traducido a Java por un buen amigo mío:

public class NetTest { public static void main (String[] args) throws Exception{ String host = "acidrayne.net"; InetAddress a = InetAddress.getByName(host); System.out.println(a.isReachable(10000)); } }

Ambos devuelven falso. Supongo que debo estar haciendo mal, pero la investigación de Google me dice de manera diferente. Estoy confuso!


La respuesta correcta no es realmente correcta, creo. Microsoft.com simplemente ignora las solicitudes de ICMP, probablemente para evitar ataques de inundación de ping básicos. En cuanto al segundo host, no tengo idea de cuál podría ser el problema con el ping, pero estoy usando GNU / Linux y el de "isReachable" funciona bien.


Actualizado en respuesta para comentar que esto es incorrecto:

¿Usando Unix / Linux?

http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html dice:

Linux / Unix, en cambio, es compatible con una llamada al sistema ICMP "ping". Entonces la implementación de java.net.InetAddress.isReachable () primero intenta realizar la llamada al sistema "ping" **; si esto falla, vuelve a intentar abrir un socket TCP en [sic - to] puerto 7 , como en Windows.

Resulta que en Linux / Unix, la llamada al sistema ping requiere privilegios de administrador, por lo que la mayoría de las veces java.net.InetAddress.isReachable () fallará, porque muchos programas Java no se ejecutan como root , y debido a que la dirección de destino es poco probable el servicio de eco en funcionamiento . Demasiado.

El siguiente comentario de @EJP indica que la parte de sobre el servicio de eco es incorrecta, está mal:

Eso no es correcto isReachable devuelve verdadero si obtiene una ConnectException que intenta conectarse al puerto 7, ya que eso prueba que el host está activo y puede enviar segmentos RST.

En casos como estos, uso un sniffer de paquetes como WireShark, tcpdump (WinDump en Windows) o snoop (Solaris) para confirmar lo que realmente está sucediendo en el cable.