Solución:
isReachable()
utilizará ICMP ECHO REQUEST
s si se puede obtener el privilegio, de lo contrario, intentará establecer una conexión TCP en el puerto 7 (Eco) del host de destino.
Por lo tanto, su problema es probablemente un problema de configuración de no tener suficientes permisos para hacer esto en la máquina cliente o un problema del puerto 7 en el servidor si su cliente no tiene permiso para hacer lo ICMP ECHO REQUEST
. Probablemente ambos en su caso, debe resolver un lado o el otro para que esto funcione.
Probé lo siguiente en clientes OSX y Linux y funciona cuando se prueba la accesibilidad de otras máquinas OSX, Linux y Windows Server. No tengo una máquina con Windows para ejecutar esto como cliente.
import java.io.IOException;
import java.net.InetAddress;
public class IsReachable
{
public static void main(final String[] args) throws IOException
{
final InetAddress host = InetAddress.getByName(args[0]);
System.out.println("host.isReachable(1000) = " + host.isReachable(1000));
}
}
por lo que leí aquí. Aparentemente es una limitación de Windows y ICMP PING
no es compatible con Windows como una llamada al sistema anterior a Windows 2000, por lo que la configuración predeterminada es intentar conectarse al puerto 7 y está bloqueado en la máquina que está tratando de “alcanzar”. Java aún no admite la nueva llamada al sistema nativo. La cuestión de los permisos es para el sistema basado en Unix, ya que requieren root para enviar ICMP
paquetes.
Si desea lanzar su propia JNI nativa de Windows ICMP PING
para Windows 2000 y versiones posteriores existe la función IcmpSendEcho.
Utilizo esta función (de este artículo) cuando necesito un ping ICMP real en Windows, Linux y OSX (no he probado otros sistemas).
public static boolean isReachableByPing(String host) {
try{
String cmd = "";
if(System.getProperty("os.name").startsWith("Windows")) {
// For Windows
cmd = "ping -n 1 " + host;
} else {
// For Linux and OSX
cmd = "ping -c 1 " + host;
}
Process myProcess = Runtime.getRuntime().exec(cmd);
myProcess.waitFor();
if(myProcess.exitValue() == 0) {
return true;
} else {
return false;
}
} catch( Exception e ) {
e.printStackTrace();
return false;
}
}
Un poco tarde, pero me encontré con esto mientras intentaba hacer lo mismo.
Una solución que funcionó para mí y que usé fue usar la línea de comando ping directamente.
public static boolean ping(String host)
{
boolean isReachable = false;
try {
Process proc = new ProcessBuilder("ping", host).start();
int exitValue = proc.waitFor();
System.out.println("Exit Value:" + exitValue);
if(exitValue == 0)
isReachable = true;
} catch (IOException e1) {
System.out.println(e1.getMessage());
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return isReachable;
}