2011-01-24 17 views
6

Como tarea tengo que encontrar todas las computadoras vivas en una LAN. Para lo cual estoy usando la función isReachable de la clase InetAddress. Pero el problema es que no se muestra nada accesible para mí. Así que traté de tener isReachable con la IP de Google, pero todavía no se puede acceder.Problema con isReachable en la clase InetAddress

Aquí está el código:

import java.net.*; 

public class alive{ 
    public static void main(String args[]){ 
     try{ 
      InetAddress ia = InetAddress.getByAddress(new byte[]{(byte)209, (byte)85, (byte)153, (byte)104}); 
      boolean b = ia.isReachable(10000); 
      if(b){ 
       System.out.println("Reachable"); 
      } 
      else{ 
       System.out.println("Unrachable"); 
      } 

     }catch(Exception e){ 
      System.out.println("Exception: " + e.getMessage()); 
     } 
    } 
} 

de salida es: Unreachable

+0

¿Ha intentado hacer ping a la dirección? –

+2

¿tiene privilegios de root? si no, intente con w/... – bestsss

+0

@pangea lo ha intentado y está haciendo ping – codeomnitrix

Respuesta

5

A continuación algunos detalles sobre por qué isReachable() no siempre podría funcionar como se esperaba

  1. http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html
  2. http://www.coderanch.com/t/206934/sockets/java/InetAdress-isReachable-Ping-Permissions

La forma correcta para usted es usar el protocolo ICMP. Esto es lo que ping utiliza internamente, creo. Here is an example para que comiences.

+1

El enlace javaranch contiene un error. isReachable() no requiere que el dispositivo de eco se esté ejecutando realmente. Interpreta el rechazo de conexión como un éxito. – EJP

+0

Ok gracias pangea lo intentaré – codeomnitrix

+0

¿Se borró la publicación de Blogspot? – abelito

2

Encontré una solución interesante. Si no puede ejecutar su aplicacion como root, es posible establecer la capacidad de toma de crudo en java:

sudo setcap cap_net_raw=ep /usr/lib/jvm/jdk/bin/java 

Y luego protocolo ICMP se utilizará Istead de solicitud de eco el 7 de puerto TCP.

0

Este es el código que es independiente de la plataforma, pero requiere información sobre cualquier puerto abierto en la otra máquina (que tenemos la mayoría del tiempo).

private static boolean isReachable(String addr, int openPort, int timeOutMillis) { 
    // Any Open port on other machine 
    // openPort = 22 - ssh, 80 or 443 - webserver, 25 - mailserver etc. 
    try { 
     try (Socket soc = new Socket()) { 
      soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis); 
     } 
     return true; 
    } catch (IOException ex) { 
     return false; 
    } 
} 
Cuestiones relacionadas