5

私は Clojure を使用していますが、Java を読むことができるので、これは Clojure 固有の質問ではありません。これはJavaからは機能していないようです。

isReachable を使用して、ちょっとした「ping」機能を実装しようとしています。私が使用しているコードは次のとおりです。

(.isReachable (java.net.InetAddress/getByName "www.microsoft.com") 5000)

私の親友によってJavaに翻訳されました:

public class NetTest {
  public static void main (String[] args) throws Exception{
    String host = "acidrayne.net";
    InetAddress a = InetAddress.getByName(host);

    System.out.println(a.isReachable(10000));
  }
}

これらは両方とも false を返します。私は間違ったことをしているに違いないと思いますが、Google の調査では別のことがわかりました。私は混乱しています!

4

2 に答える 2

3

これは間違っているというコメントに応じて更新されました。

Unix/Linux を使用していますか??

http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html言います:

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

Linux/Unix では、ping システム コールには root 権限が必要であることがわかりました。そのため、多くの Java プログラムは root として実行されず、ターゲット アドレスが root 権限を持っている可能性が低いため、ほとんどの場合 java.net.InetAddress.isReachable() は失敗します。 the echo service up and running . 残念な。

@EJP からの以下のコメントは、echo サービスについての部分が間違っていることを示しています。

それは正しくありません。isReachable は、ポート 7 に接続しようとして ConnectException を取得した場合に true を返します。これは、ホストが起動しており、RST セグメントを送信できることが証明されているためです。

このような場合、WireShark、tcpdump (Windows では WinDump)、または snoop (Solaris) などのパケット スニファを使用して、ネットワーク上で実際に何が起こっているかを確認します。

于 2010-05-05T22:57:03.523 に答える
1

正解は実際には正しくないと思います。Microsoft.com は、おそらく基本的な ping フラッド攻撃を回避するために、単に ICMP 要求を無視します。2 番目のホストについては、ping の何が問題なのかわかりませんが、GNU/Linux を使用しており、isReachable は問題なく動作します。

于 2010-05-06T06:22:37.097 に答える