Dévoilement de la déconnexion : pourquoi InetAddress.isReachable() signale faussement
Lorsque vous tentez de déterminer l'accessibilité d'une adresse IP à l'aide d'InetAddress.isReachable (), les utilisateurs peuvent rencontrer de fausses réponses inattendues même s'ils parviennent à envoyer une requête ping à la même adresse. Cet écart peut être attribué aux limitations de la mise en œuvre d'isReachable().
Contrairement au ping, qui envoie directement un paquet réseau à l'adresse IP cible, isReachable() s'appuie sur un mécanisme dépendant de la plate-forme connu sous le nom d'ICMP (Internet Control Message Protocol) demandes d'écho. Si la requête ICMP ne reçoit pas de réponse dans le délai d'expiration spécifié, isReachable() renvoie false, même si l'adresse IP est toujours accessible.
Fournir une solution multiplateforme
Pour une solution indépendante de la plate-forme qui englobe une gamme de vérifications de connectivité, envisagez d'utiliser une technique qui recherche les ports ouverts sur la machine cible. Cette approche exploite le fait que la plupart des appareils possèdent des ports ouverts pour des services tels que SSH, des serveurs Web ou des serveurs de messagerie.
Voici un extrait de code qui implémente cette méthode :
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 Grâce à cette technique, vous obtenez la possibilité de déterminer l'accessibilité quelle que soit la plate-forme sous-jacente, garantissant ainsi des résultats plus cohérents.
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!