2016-03-30 16 views
4

Uygulamamın, kodun yürütülmesi için birçok IP adresini bir kerede ping etmesi gerekiyor. Örneğin, bir saniyeden sonra zaman aşımına uğrayan 300 ip adresi ping işlemi 5 dakika sürecektir, oysa bir seferde 20 çalıştırılırsa, sadece yaklaşık 15 saniye sürecektir.Windows'ta Java kullanarak ping.exe'yi kullanmadan birden fazla ping'i aynı anda nasıl gönderebilirim?

Bunun için windows ping.exe'yi çağırmayı denedim, ancak bununla iki ayrı ve benzer sorun yaşadım. Bir sorun, bazı windows makinelerinde, ping iş parçacığını öldürene kadar hiçbir sebep göstermeden dakikalarca bekleyeceğim ve ölür. Diğer bir sorun, ping.exe herhangi bir ping.exe çağrısı sonsuza kadar sürer önce makineleri üzerinde tamamen kırdı ettik, bu yüzden yüzlerce ping.exe süreçleri makine çöker kadar kazık başlar ve komut ile elle ping.exe çalışan Bu durumda satır sadece sonsuza kadar başka bir ping işlemi bırakır.

Ben icmp4j adında bir kütüphane kullanarak denedi, ama bu kütüphane sadece Windows üzerinde gerçekleşmesi seferinde bir ping sağlar.

Bu person's code numaralı telefonu denedim ve yerel ağımda sorunlara yol açtım. Var olmayan bir yerel adrese (alt ağınızda) ping yaparken, adrese ulaşılamayacağını belirten bir yanıt alabilirsiniz. Bu cevapların tam olarak% 50'sinde, bir zaman aşımı olurdum ve diğer% 50'sinde 'çözümsüz' olurdum.

kimse icmp4j veya ping.exe kullanmadan aynı anda pencerelerde birçok ping çalıştırmak için bir yöntem biliyor mu?

+1

Olası kopya [java kodu bir IP adresine ping yapmak için] (http://stackoverflow.com/questions/11506321/java-code-to-ping-an-ip-address) – Tim

+0

Şuna bir bakın: http: //stackoverflow.com/questions/3584210/preferred-java-way-to-ping-a-http-url-for-availability –

+0

@JohnKane \t Bu işe yaramaz çünkü aslında ICMP ping'i yapmak zorundayım. soket bağlantısı. – Jdban101

cevap

1

InetAddress.isReachable(), ihtiyacınız olan çıplak kemikleri araçtır.

icmp4j, sadece isReachable ürününün etrafındaki sarıcı olduğundan işi iyi yapmalıdır. kodun hızlı bir inceleme korkunç endişe verici görünmüyor olsa Belki de, statik giriş noktası IcmpPingUtil.executePingRequest() kullanamaz. Bu yöntemdeki koddan geçerseniz (NativeBridge veya JavaNativeBridge, IcmPingRequest ve IcmpPingResponse yeterli olmalıdır), ihtiyacınız olanı yapabilecek sağlam bir threadsafe sınıfı oluşturabilmeniz gerekir.

+0

'InetAddress.isReachable()' Windows ile kullanıldığında aslında ping yapmaz. Bir yanıt alıp almadığını görmek için bağlantı noktası 7'ye bir TCP bağlantısı dener. http://stackoverflow.com/questions/11587271/isreachable-always-returning-true-regardless-of-what-the-ip-address-is 'WindowsNativeBridge.java' dosyasında bir yorum bana gelen kopyalama düşündürüyor aynı sorunu sahip olacaktır: _WARNING: Bu yöntem birden çok iş parçacığı IcmpLibrary.IcmpSendEcho(), sonra sonuçları bozuk diyoruz çünkü eğer senkronize edilir !!! Şu an için, IcmpSendEcho2'yi nasıl arayacağımızı veya ping'i aramanın başka bir seçeneği yok.exe_ – Jdban101

+1

Yorumlarını bana endişelendiren şey, denemek için bana bir şey vermesidir, ancak mutlaka işe yarayacağı ve karmaşıklaştığı anlamına gelmez. – Jdban101

+0

Bozulmaması gereken cevaba ihtiyacınız var mı? Eğer ping için bir ping'e ihtiyacınız varsa ve ICMP cevabı içindeki değerlere erişmeye ihtiyacınız yoksa, ihtiyaçlarınız için yeterince iyi olabilir. ( Alternatif olarak, linux'a yükseltme) –

İlgili konular