Maison >Java >javaDidacticiel >Pourquoi `InetAddress.isReachable()` renvoie-t-il False même si le ping réussit ?

Pourquoi `InetAddress.isReachable()` renvoie-t-il False même si le ping réussit ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-07 01:58:121058parcourir

Why Does `InetAddress.isReachable()` Return False Even Though Ping Succeeds?

Pourquoi inetAddress.isReachable() renvoie False malgré un ping réussi

Votre code récupère une instance InetAddress pour une adresse IP spécifique, puis appelle son Méthode isReachable() avec un délai d'attente de 1000 millisecondes :

InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));

Cependant, étonnamment, isReachable() renvoie false, même si vous parvenez à envoyer une requête ping à l'adresse IP.

Cause et solution

Cause :

isReachable() ne repose pas sur le ping commande ou tout autre outil spécifique au système d’exploitation. Au lieu de cela, il utilise le protocole ICMP pour vérifier si l'hôte est joignable en envoyant des messages ICMP Echo Request et en attendant les messages ICMP Echo Reply. Certains systèmes peuvent bloquer le trafic ICMP, entraînant l'échec de la méthode isReachable().

Solution :

Pour déterminer l'accessibilité sans compter sur isReachable(), vous pouvez utiliser le code Java suivant :

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 (Socket soc = new Socket()) {
        soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
        return true;
    } catch (IOException ex) {
        return false;
    }
}

Cette méthode tente de se connecter au port ouvert spécifié sur la machine distante. Si la connexion réussit, cela signifie que l'hôte est joignable. Le port ouvert peut être n'importe quel port généralement accessible, tel que 22 pour SSH, 80 pour HTTP ou 443 pour HTTPS.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn