3

そのため、私はisReachableを使用してJavaコードのアドレスに「ping」を実行しています。このコードブロックは、誰もが使用しているように見えるものです。

    try
    {
    InetAddress address = InetAddress.getByName("172.16.2.0");
    // Try to reach the specified address within the timeout
    // periode. If during this periode the address cannot be
    // reach then the method returns false.
    boolean reachable = address.isReachable(10000);
    System.out.println("Is host reachable? " + reachable);
    } catch (Exception e)
    {
    e.printStackTrace();
    }

私の問題は、IPアドレスに何を使用しても、常にtrueが返されることです。空の文字列に変更しても。なぜ何かアイデアはありますか?

4

1 に答える 1

2

java.net.InetAddress.isReachable()メソッドを介して、あるアドレスに到達可能かどうかを確認する方法。これらのメソッドの実装はネイティブになり、InetAddressで表されるアドレスに「ping」を実行するために最善を尽くします。

驚いたことに、WindowsとLinux/Unixの実装には多くの違いがありますjava.net.InetAddress.isReachable()

Windowsは、奇妙なことに、ICMP「ping」システムコールを公式にはサポートしていません。したがって、Java SE 5の実装は、ポート7(エコーサービス)でTCPソケットを開こうとし、何らかの応答を取得することを望んでいます。

代わりに、Linux / Unixは、ICMP「ping」システムコールをサポートしています。したがって、java.net.InetAddress.isReachable()の実装は、最初に「ping」システムコールを実行しようとします。これが失敗した場合、Windowsの場合と同様に、ポート7でTCPソケットを開こうとしてフォールバックします。

Linux / Unixでは、pingシステムコールにはroot権限が必要であることが判明しました。そのため、多くのJavaプログラムがrootとして実行されないため、ほとんどの場合java.net.InetAddress.isReachable()は失敗します。

正しいアプローチはICMPプロトコルです。これは、pingが内部で使用するものです。知識を集めて先に進むには、これを参照することをお勧めします。

FROM: SimoneBordetのブログ

于 2012-07-20T21:49:04.737 に答える