3

アクティブなインターネット接続が存在するかどうかを確認したい。そのために、InetAddressクラスのisReachable()メソッドを使用してそれを実行できることがわかりました。残念ながら(JavaDocが示唆し、この投稿が検証しているように)、これはルート特権でのみ機能します。これは私の問題の解決策ではありません。

次のコードを実行すると、isReachableは常にfalseになります。

InetAddress address = InetAddress.getByName("173.194.35.3"); //e.g. google
boolean isReachable = address.isReachable(2000); //ms

したがって、私はルート特権を必要とせずにアクティブなインターネット接続をチェックするための良い代替手段を探しています。

ありがとうございました!

4

4 に答える 4

2

ICMPプロトコルを知っていますか?これは、pingが内部で使用しているものだと私は信じています。この例を確認してください。(これはWindowsのソリューションですが)

さらに、このトピックに関する高レベルの議論については、この投稿を読んでください!

于 2012-10-21T10:03:16.977 に答える
0

Javadocはそれをまったく述べておらず、リンクした投稿もそれを「検証」していません。実際は、「通常の実装では、特権を取得できる場合はICMP ECHO REQUESTを使用します。それ以外の場合は、宛先ホストのポート7(Echo)でTCP接続を確立しようとします。」

つまり、このメソッドを呼び出すための特権はまったく必要ありません。必要なのはICMPモードの特権だけです。それらがない場合(またはICMP実装が使用されていないためWindowsを使用している場合)、ポート7にTCPを使用します。また、接続の成功または接続の拒否のいずれかを「到達可能」として扱うことに注意してください。

于 2012-10-21T22:28:50.660 に答える
0

古い場合もありますが、同じ問題があり、それらの回答を読んだ後、このすばらしいライブラリicmp 4jを見つけて、すべての問題を解決しました。ここからソースコードをダウンロードして、プロジェクトで次のように使用できます。

// request
final IcmpPingRequest request = IcmpPingUtil.createIcmpPingRequest ();
request.setHost ("192.168.0.101");

// repeat a few times
for (int count = 1; count <= 4; count ++) {

// delegate
final IcmpPingResponse response = IcmpPingUtil.executePingRequest (request);

// log
final String formattedResponse = IcmpPingUtil.formatResponse (response);
System.out.println (formattedResponse);

// rest
Thread.sleep (1000);
}
于 2015-05-07T18:24:07.710 に答える
0

InetAddress.isReachable()-なしで実行できますroot

java実行可能ファイルにICMPパケットなどを送信する機能を割り当てるだけです。

これは次のように行います。(ルートとして実行)

setcap cap_net_raw + eip $ JAVA_HOME / bin / java

そして、あなたはそれを持っています...あなたのJavaアプリはrootでなくてもpingできます!


次のエラーが発生した場合。

./java:共有ライブラリのロード中にエラーが発生しました:libjli.so:共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません

これは次のように修正できます。(rootとして実行する必要が/usr/lib64あります。正しいことを確認してください)

ln -s $ JAVA_HOME / lib / amd64 / jli / libjli.so /usr/lib64/libjli.so

注意:残念ながら、実行するだけでexport LD_LIBRARY_PATH=$JAVA_HOME/lib/amd64/jliは機能しません。

于 2018-10-09T04:22:40.290 に答える