2016-03-30 17 views
4

Meine Anwendung muss viele IP-Adressen auf einmal für die Geschwindigkeit der Ausführung des Codes pingen. Zum Beispiel würde das Pingen von 300 IP-Adressen, die nach einer Sekunde ablaufen, 5 Minuten dauern, während, wenn 20 zu einer Zeit ausgeführt werden, es nur ungefähr 15 Sekunden dauern wird.Wie kann ich mehrere Pings auf einmal unter Verwendung von Java unter Windows ohne ping.exe senden?

Ich habe versucht, Windows ping.exe dafür aufrufen, aber ich hatte zwei separate und ähnliche Probleme damit. Ein Problem ist, dass auf einigen Windows-Rechnern der Ping-Befehl scheinbar ohne Grund für Minuten anhält, bis ich den Thread töte und er stirbt. Das andere Problem, wir hatten ping.exe vollständig auf Maschinen brechen, wo jeder Ping.exe Aufruf für immer dauert, so Hunderte von ping.exe Prozesse beginnen zu häufen, bis der Computer abstürzt, und Ping.exe manuell von dem Befehl ausführen Linie in diesem Fall lässt nur einen anderen Ping-Prozess für immer hängen.

Ich habe versucht, eine Bibliothek mit dem Namen icmp4j zu verwenden, aber diese Bibliothek ermöglicht nur ein Ping zu einem Zeitpunkt auf Windows passieren.

Ich habe versucht, diese person's code und endete mit Problemen in meinem lokalen Netzwerk. Wenn Sie eine lokale Adresse anpingen, die nicht vorhanden war (in Ihrem Subnetz), können Sie anscheinend eine Antwort erhalten, die besagt, dass die Adresse nicht erreichbar ist. Bei genau 50% dieser Antworten würde ich eine Auszeit bekommen, und bei den anderen 50% würde ich "nicht pimpbar" bekommen.

Kennt jemand eine Methode zum Ausführen vieler Pings auf Windows zur gleichen Zeit ohne Verwendung von ICMP4J oder Ping.exe?

+1

Mögliche Duplikat (http://stackoverflow.com/questions/11506321/java-code-to-ping-an-ip-address) – Tim

+0

[Java-Code eine IP-Adresse ping] Werfen Sie einen Blick auf: http: //stackoverflow.com/questions/3584210/preferred-java-way-to-ping-a-http-url-for-availability –

+0

@ JohnKane \t Das wird nicht funktionieren, weil ich tatsächlich einen ICMP-Ping tun muss, nicht eine Socket-Verbindung. – Jdban101

Antwort

1

InetAddress.isReachable() ist das nackte Werkzeug, das Sie brauchen.

icmp4j sollte die Arbeit gut tun, denn das ist nur ein Wrapper um isReachable. Vielleicht können Sie den statischen Einstiegspunkt IcmpPingUtil.executePingRequest() nicht verwenden, obwohl eine schnelle Überprüfung des Codes nicht besonders beunruhigend aussieht. Wenn Sie den Code in dieser Methode durchlaufen (NativeBridge oder JavaNativeBridge, IcmPingRequest und IcmpPingResponse sollte genug sein) dann sollten Sie in der Lage sein, eine robuste threadsafe Klasse zu bauen, die tun kann, was Sie brauchen.

+0

'InetAddress.isReachable()', wenn mit Windows verwendet wird, pingt nicht. Es versucht eine TCP-Verbindung zu Port 7, um zu sehen, ob es eine Antwort erhält. http://stackoverflow.com/questions/11587271/isreachable-always-returning-true-regardless-of-what-the-ip-address-is Ein Kommentar in der 'WindowsNativeBridge.java' Datei macht mich denken, Kopieren von Es wird das gleiche Problem haben: _WARNING: diese Methode wird synchronisiert, weil wenn mehrere Threads IcmpLibrary.IcmpSendEcho() aufrufen, dann sind die Ergebnisse beschädigt !!! Jetzt haben wir keine andere Wahl, als herauszufinden, wie IcmpSendEcho2 aufgerufen wird, oder ping aufzurufen.exe_ – Jdban101

+1

Was mich beunruhigt ihren Kommentar ist, dass es mir etwas zu versuchen gibt, aber es bedeutet nicht unbedingt, dass es funktioniert und es ist kompliziert. – Jdban101

+0

Müssen Sie die Antwort nicht beschädigt haben? Wenn Sie nur einen Ping zum Pingen benötigen und keinen Zugriff auf die Werte innerhalb der ICMP-Antwort benötigen, ist dies möglicherweise für Ihre Anforderungen ausreichend. ( Alternativ, Upgrade auf Linux) –