2010-05-05 24 views
5

J'utilise Clojure, mais je peux lire Java, donc ce n'est pas une question spécifique à Clojure. Cela ne semble même pas fonctionner à partir de Java. J'essaie d'implémenter un peu d'une fonction 'ping' en utilisant isReachable. Le code J'utilise est la suivante:isReachable en Java ne semble pas fonctionner comme il le devrait

(.isReachable (java.net.InetAddress/getByName "www.microsoft.com") 5000) 

Traduit Java par un bon ami à moi:

public class NetTest { 
    public static void main (String[] args) throws Exception{ 
    String host = "acidrayne.net"; 
    InetAddress a = InetAddress.getByName(host); 

    System.out.println(a.isReachable(10000)); 
    } 
} 

Ces deux return false. Je suppose que je dois faire fausse route, mais la recherche de Google me dit différemment. Je suis confus!

+0

Pouvez-vous pinguer acidrayne.net depuis la machine sur laquelle vous exécutez cette commande? – Yishai

+0

Je peux pinguer acidrayne.net via 'ping -c 1 acidrayne.net', mais pas via le code affiché ci-dessus. Et c'est sur n'importe quelle machine. – Rayne

Répondre

3

Mise à jour en réponse au commentaire que cela est faux:

utilisant Unix/Linux ??

http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html dit:

Linux/Unix, à la place, prend en charge un appel système ICMP "ping". Ainsi, l'implémentation de java.net.InetAddress.isReachable() essaie d'abord d'effectuer le "ping" appel système **; si cela échoue, il retombe en essayant d'ouvrir un socket TCP sur le port [sic-to] 7, comme dans Windows.

Il se trouve que sous Linux/Unix l'appel système ping nécessite des privilèges root, donc la plupart du temps java.net.InetAddress.isReachable() échouera, car de nombreux programmes Java ne sont pas exécutés en tant que root , et parce que l'adresse cible improbable a le service d'écho en cours d'exécution. Dommage.

Le commentaire ci-dessous de @EJP indique la partie sur le service d'écho est faux, faux faux:

n'est pas exact. isReachable renvoie true s'il obtient une ConnectException essayant de se connecter au port 7, car cela prouve que l'hôte est en place et capable d'envoyer des segments RST.

Dans des cas comme ceux-ci, j'utiliser un renifleur de paquets comme Wireshark, tcpdump (WinDump sous Windows) ou snoop (Solaris) pour confirmer ce qui se passe réellement sur le fil.

+0

C'est assez horrible. – Rayne

+0

@Rayne - Convenu –

+2

Ce n'est pas correct. isReachable renvoie true s'il obtient une ConnectException essayant de se connecter au port 7, car cela prouve que l'hôte est en place et capable d'envoyer des segments RST. – EJP

1

La bonne réponse n'est pas correcte, je pense. Microsoft.com ignore simplement les requêtes ICMP, probablement pour éviter les attaques ping de base. En ce qui concerne le second hôte, je n'ai aucune idée de ce que pourrait être le problème avec le ping, mais j'utilise GNU/Linux et isReachable fonctionne très bien.

+0

Cela fonctionne très bien si je l'exécute en tant que root, et un ami expérimente exactement la même chose, donc je suis assez certain que sa réponse était au moins correcte jusqu'à ce point. – Rayne

+0

Peut-être que oui. Je ne suis pas expert, je dis juste que l'exécution du code en utilisant isReachable() alors que pas sous Linux a fonctionné pour certains hôtes ... –