10

ホストに到達しようとしていて、次のコードがあります

if(!InetAddress.getByName(host).isReachable(TIMEOUT)){
   throw new Exception("Host does not exist::"+ hostname);
 }

ホスト名は Windows から ping でき、また tracert を実行すると、すべてのパケットが返されます。しかし、Java は「ホストが存在しません::」という例外をスローします。

私が実験したタイムアウト値は、2000ms から 5000ms までです。私も3000にしてみました。私が理解できないこの問題の原因は何ですか。ネットで調べたところ、 InetAddress.getByName(host).isReachable(time) は信頼性がなく、内部システムに従って動作するという人もいます。

これが本当なら、これに代わる最良の方法は何ですか。提案してください。

4

3 に答える 3

14

開いていると思われるポートへの TCP ソケットを開きます (Linux の場合は 22、Windows の場合は 139 など)。

public static boolean isReachableByTcp(String host, int port, int timeout) {
    try {
        Socket socket = new Socket();
        SocketAddress socketAddress = new InetSocketAddress(host, port);
        socket.connect(socketAddress, timeout);
        socket.close();
        return true;
    } catch (IOException e) {
        return false;
    }
}

または、ハックを使用して実際の ping を送信します。(ここから着想を得た: http://www.inprose.com/en/content/icmp-ping-in-Java )

public static boolean isReachableByPing(String host) {
    try{
        String cmd = "";

        if(System.getProperty("os.name").startsWith("Windows"))
            cmd = "cmd /C ping -n 1 " + host + " | find \"TTL\"";
        else
            cmd = "ping -c 1 " + host;

        Process myProcess = Runtime.getRuntime().exec(cmd);
        myProcess.waitFor();

        return myProcess.exitValue() == 0;
    } catch( Exception e ) {
        e.printStackTrace();
        return false;
    }
}

Android 用の同じハックは、次の場所にあります

于 2013-09-17T08:57:06.993 に答える