Maison >Java >javaDidacticiel >Pourquoi `InetAddress.isReachable()` renvoie-t-il parfois False lorsque le ping réussit ?

Pourquoi `InetAddress.isReachable()` renvoie-t-il parfois False lorsque le ping réussit ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-25 03:53:12350parcourir

Why Does `InetAddress.isReachable()` Sometimes Return False When Ping Succeeds?

InetAddress.isReachable() renvoyant False malgré l'accessibilité de Ping

En Java, InetAddress.isReachable() est utilisé pour vérifier si une adresse IP donnée l'adresse est accessible depuis la machine actuelle. Étonnamment, vous pouvez rencontrer un scénario dans lequel cette méthode renvoie false même si vous parvenez à envoyer une requête ping à l'adresse IP.

Cette incohérence survient car InetAddress.isReachable() n'utilise pas le même mécanisme que le ping. Au lieu de cela, il utilise l'implémentation de la plate-forme sous-jacente du protocole ICMP (Internet Control Message Protocol), qui peut différer de la commande ping.

Solution indépendante de la plate-forme

Pour résoudre cet écart et gagner en indépendance de la plate-forme, envisagez l'approche suivante :

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 solution vérifie l'accessibilité de l'adresse IP spécifiée en essayant pour vous connecter à un port ouvert (par exemple, le port 22 pour SSH, le port 80 ou 443 pour les serveurs Web, etc.) à l'aide du protocole TCP. Si la connexion réussit, l'adresse IP est considérée comme accessible ; sinon, cela indique une inaccessibilité.

Version succincte

Par souci de concision, vous pouvez condenser le code comme suit :

private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
    try (Socket soc = new Socket()) {
        soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
        return true;
    } catch (IOException ex) {
        return false;
    }
}

Cette plate-forme indépendante Cette approche fournit un moyen fiable de vérifier l'accessibilité d'une adresse IP quelle que soit la mise en œuvre ICMP sous-jacente.

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