2011-01-24 9 views
6

割り当てとして、LAN上のすべての生存コンピュータを見つける必要があります。そのため私はInetAddressクラスのisReachable機能を使用しています。しかし問題は、私に届くものが何も表示されないことです。だから私はisReachableをGoogleのIPにしようとしましたが、それでも到達できません。InetAddressクラスのisReachableに関する問題

import java.net.*; 

public class alive{ 
    public static void main(String args[]){ 
     try{ 
      InetAddress ia = InetAddress.getByAddress(new byte[]{(byte)209, (byte)85, (byte)153, (byte)104}); 
      boolean b = ia.isReachable(10000); 
      if(b){ 
       System.out.println("Reachable"); 
      } 
      else{ 
       System.out.println("Unrachable"); 
      } 

     }catch(Exception e){ 
      System.out.println("Exception: " + e.getMessage()); 
     } 
    } 
} 

出力は次のとおりです:ここで

はコードである。ここ Unreachable

+0

アドレスにピンしてみましたか? –

+2

あなたはroot権限を持っていますか? – bestsss

+0

@pangea yaは試してみましたが、それは – codeomnitrix

答えて

5

が常に期待通りに動作しない理由(isReachable)上のいくつかの詳細です

  1. http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html
  2. http://www.coderanch.com/t/206934/sockets/java/InetAdress-isReachable-Ping-Permissions

正しい方法はICMPプロトコルを使用することです。これは何ですかpingはinternatllyを使用しています。 Here is an exampleを起動してください。

+1

javaranchリンクにエラーがあります。 isReachable()では、エコーデバイスが実際に実行されている必要はありません。接続の拒否を成功として解釈します。 – EJP

+0

ありがとうpangea私はそれを試します – codeomnitrix

+0

Blogspotの投稿は削除されますか? – abelito

2

興味深い解決策が見つかりました。

sudo setcap cap_net_raw=ep /usr/lib/jvm/jdk/bin/java 

をそして、ICMPプロトコルは7 TCPポート上のエコー要求のisteadに使用されます:あなたがrootとしてあなたのaplicationを実行できない場合は、Javaをrawソケット機能を設定することがあります。

0

ここにはプラットフォームに依存しないコードがありますが、他のマシン(私たちはほとんどの時間を持っています)の開いているポートに関する情報が必要です。

private static boolean isReachable(String addr, int openPort, int timeOutMillis) { 
    // Any Open port on other machine 
    // openPort = 22 - ssh, 80 or 443 - webserver, 25 - mailserver etc. 
    try { 
     try (Socket soc = new Socket()) { 
      soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis); 
     } 
     return true; 
    } catch (IOException ex) { 
     return false; 
    } 
}