2016-03-30 15 views
4

私のアプリケーションは、コードの実行速度を高めるために、一度に多くのIPアドレスにpingする必要があります。たとえば、1秒後にタイムアウトする300個のIPアドレスにpingを実行すると、5分かかることになります。一方、20個を一度に実行すると、約15秒かかります。ping.exeを使用せずにWindows上のJavaを使用して一度に複数のpingを送信するにはどうすればよいですか?

私はこのためにWindows ping.exeを呼び出そうとしましたが、2つの別々の問題がありました。 1つの問題は、一部のWindowsマシンでは、スレッドを強制終了して終了するまで、何も理由がないためにpingが数分間停止するということです。もう1つの問題は、ping.exeが完全に休止してからping.exeの呼び出しが永遠に続くため、数百のping.exeプロセスがマシンがクラッシュするまで積み重なり始め、コマンドからping.exeを手動で実行することですこの場合、もう1つのpingプロセスが永遠に停止します。

icmp4jというライブラリを使用しようとしましたが、そのライブラリではWindows上で一度に1つのpingしか実行できません。

私はこれを試しましたperson's codeと私のローカルネットワーク上の問題に実行を終了しました。存在しなかった(サブネット上に存在しない)ローカルアドレスにpingを実行すると、明らかにそのアドレスに到達できないという返信を得ることができます。それらの回答の正確に50%で、私はタイムアウトを得て、残りの50%で私は「おしゃべりできません」。

icmp4jやping.exeを使わずに、同時に多数のpingを実行する方法を知っている人はいますか?

+1

[JavaコードからpingするIPアドレス]の重複している可能性があります(http://stackoverflow.com/questions/11506321/java-code-to-ping-an-ip-address) – Tim

+0

http: //stackoverflow.com/questions/3584210/preferred-java-way-to-ping-a-http-url-for-availability –

+0

@JohnKane \t実際にはICMP pingを実行する必要があるため、動作しません。ソケット接続。 – Jdban101

答えて

1

InetAddress.isReachable()は、あなたが必要とするベアボーンツールです。

icmp4jはちょうど良い仕事をする必要があります。それはちょうどisReachableのラッパーです。おそらく、静的エントリポイントIcmpPingUtil.executePingRequest()を使用することはできませんが、コードのクイックレビューはひどく心配していません。そのメソッド(NativeBridgeまたはJavaNativeBridgeIcmPingRequestおよびIcmpPingResponseで十分であるはずです)でコードを実行すると、必要な処理を実行できる強力なスレッドセーフクラスを構築できます。

+0

'InetAddress.isReachable()'は、ウィンドウで使用すると実際にpingを実行しません。ポート7へのTCP接続を試行して、応答を受け取るかどうかを確認します。 http://stackoverflow.com/questions/11587271/isreachable-always-returning-true-regardless-of-what-the-ip-address-is 'WindowsNativeBridge.java'ファイルのコメントは私が _WARNING:このメソッドは、複数のスレッドがIcmpLibrary.IcmpSendEcho()を呼び出すと結果が破損するため、同期されます。だから私たちはIcmpSendEcho2を呼び出す方法やpingを呼び出す方法以外の選択肢はありません。exe_ – Jdban101

+1

私は彼らのコメントが私に何か試してもらうことを心配していますが、必ずしもそれが機能し複雑になるということを意味するものではありません。 – Jdban101

+0

応答が破損しないようにする必要がありますか? pingをpingするだけで、ICMP応答内の値にアクセスする必要がない場合は、必要に応じて十分な可能性があります。 (あるいは、にアップグレードしてください) –

関連する問題