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
Libérer: 2024-12-07 01:58:12
original
1002 Les gens l'ont consulté

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));
Copier après la connexion

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;
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal