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!