2010-05-05 12 views
5

Ich benutze Clojure, aber ich kann Java lesen, also ist dies keine Clojure spezifische Frage. Dies scheint nicht einmal von Java zu funktionieren.isReachable in Java scheint nicht so zu funktionieren, wie es soll

Ich versuche, ein bisschen eine "Ping" -Funktion mit IsReachable zu implementieren. Der Code ich verwende, ist dies:

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

von einem guten Freund von mir Java übersetzt:

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

Beide false zurück. Ich nehme an, ich muss es falsch machen, aber Google-Forschung sagt mir anders. Ich bin verwirrt!

+0

Können Sie pic acidrayne.net von der Maschine, auf der Sie dies ausführen, pingen? – Yishai

+0

Ich kann acidrayne.net über 'ping -c 1 acidrayne.net' pingen, aber nicht über den oben angegebenen Code. Und das ist auf jeder Maschine. – Rayne

Antwort

3

in Reaktion Aktualisiert Kommentar, dass dies falsch ist:

Unix/Linux verwenden ??

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

Linux/Unix, stattdessen ein ICMP "ping" Systemaufruf unterstützt. So versucht die Implementierung von java.net.InetAddress.isReachable() zuerst den "ping" Systemaufruf durchzuführen **; Wenn dies fehlschlägt, fällt es zurück, versucht, einen TCP-Socket auf [sic - zu] 7, wie in Windows zu öffnen.

Es stellt sich heraus, dass in Linux/Unix den ping Systemaufruf Root-Rechte benötigt, so dass die meisten der Zeiten java.net.InetAddress.isReachable() fehl, weil viele Java-Programme als root ausführen nicht , und weil die Zieladresse unwahrscheinlich ist, hat der Echo-Dienst ausgeführt. Schade.

Der Kommentar unterhalb von @EJP gibt den Teil über den Echo-Service ist falsch, falsch falsch:

, die nicht korrekt ist. isReachable gibt true zurück, wenn eine ConnectException versucht, eine Verbindung zu Port 7 herzustellen, da dies beweist, dass der Host aktiv ist und RST-Segmente senden kann.

In solchen Fällen verwende ich ein Paket-Sniffer wie Wireshark, tcpdump (WinDump unter Windows) oder Snoop (Solaris), um zu bestätigen, was wirklich auf dem Draht geschieht.

+0

Das ist ziemlich schrecklich. – Rayne

+0

@Rayne - Einverstanden –

+2

Das ist nicht korrekt. isReachable gibt true zurück, wenn eine ConnectException versucht, eine Verbindung zu Port 7 herzustellen, da dies beweist, dass der Host aktiv ist und RST-Segmente senden kann. – EJP

1

Die richtige Antwort ist eigentlich nicht korrekt, denke ich. Microsoft.com ignoriert ICMP-Anfragen einfach, um grundlegende Ping-Flood-Angriffe zu vermeiden. Was den zweiten Host angeht, habe ich keine Ahnung, was das Problem mit dem Ping sein könnte, aber ich benutze GNU/Linux und isReachable funktioniert gut.

+0

Es funktioniert ganz gut, wenn ich es als root ausführe, und ein Freund erfährt genau dasselbe, also bin ich ziemlich sicher, dass seine Antwort bis zu diesem Punkt zumindest korrekt war. – Rayne

+0

Vielleicht so. Ich bin kein Experte, ich sage nur, dass das Ausführen von Code mit isReachable() funktioniert, während root unter Linux nicht für einige Hosts funktioniert hat ... –