2010-05-05 28 views
5

Estoy usando Clojure, pero puedo leer Java, por lo que esta no es una pregunta específica de Clojure. Esto ni siquiera parece funcionar desde Java.isReachable en Java no parece funcionar del modo que se supone que es

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

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

traduce 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 return false. Supongo que debo estar haciendo mal, pero la investigación de Google me dice de manera diferente. Estoy confuso!

+0

¿Puede hacer ping a acidrayne.net desde la máquina en la que está ejecutando esto? – Yishai

+0

Puedo hacer ping a acidrayne.net a través de 'ping -c 1 acidrayne.net', pero no a través del código publicado anteriormente. Y eso está en cualquier máquina. – Rayne

Respuesta

3

actualizado en respuesta al comentario de que esto está mal:

El uso de Unix/Linux ??

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

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

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

El comentario más abajo de @EJP indica la parte de sobre el servicio de eco está mal, mal mal:

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

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

+0

Eso es bastante horrible. – Rayne

+0

@Rayne - De acuerdo –

+2

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

1

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.

+0

Funciona muy bien si lo ejecuto como root, y un amigo experimenta exactamente lo mismo, por lo que estoy bastante seguro de que su respuesta fue al menos correcta hasta ese momento. – Rayne

+0

Quizás sí. No soy experto, solo digo que ejecutar código usando isReachable() mientras que no es root en Linux ha funcionado para algunos hosts ... –

Cuestiones relacionadas