Maison  >  Article  >  Java  >  Pourquoi `InetAddress.isReachable()` renvoie-t-il parfois False même lorsqu'un hôte peut être pingé ?

Pourquoi `InetAddress.isReachable()` renvoie-t-il parfois False même lorsqu'un hôte peut être pingé ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-27 19:13:11795parcourir

Why Does `InetAddress.isReachable()` Sometimes Return False Even When a Host is Pingable?

Enquête sur la fausse accessibilité à partir d'InetAddress.isReachable()

InetAddress, une classe Java permettant de travailler avec des adresses IP, fournit des méthodes pour divers réseaux. tâches connexes. L'une de ces méthodes est isReachable(), utilisée pour déterminer si un hôte est accessible via un réseau. Cependant, dans certains cas, cette méthode peut renvoyer false même lorsque le ping de l'adresse IP réussit.

Considérez l'extrait de code suivant qui tente de vérifier l'accessibilité d'un hôte :

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

Si Si vous exécutez ce code, vous pourriez rencontrer une situation dans laquelle isReachable() renvoie false, malgré le fait que vous puissiez envoyer une requête ping à l'adresse IP spécifiée.

Pour résoudre ce problème problème, une approche alternative est présentée, qui reste indépendante de la plate-forme et exploite les informations sur les ports ouverts sur la machine distante.

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;
    }
}

En utilisant ce code, vous pouvez déterminer l'accessibilité d'un hôte en tentant d'établir une connexion à un port ouvert connu sur cet hôte.

Mise à jour :

Pour une version plus concise du code extrait, reportez-vous à ce qui 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;
    }
}

En employant cette approche, vous pouvez déterminer de manière fiable l'accessibilité d'un hôte, même dans les scénarios où InetAddress.isReachable() ne fournit pas d'indication précise.

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