Problem with isReachable in InetAddress class

霸气de小男生 提交于 2019-11-26 18:28:40

问题


As an assignment I have to find all the alive computers on a LAN. For which I am using isReachable function of InetAddress class. But problem is that nothing is shown reachable to me. So I tried to have isReachable with Google's IP but still this is unreachable.

Here is the code:

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());
        }
    }
}

Output is : Unreachable


回答1:


Here are some details on why isReachable() might not always work as expected

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

The correct way for you is to use the ICMP protocol. This is what ping uses internatlly, I believe. Here is an example that get you started.




回答2:


Here is the code which is platform independent, but requires information about any open port on the other machine (which we have most of the time).

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;
    }
}



回答3:


I found interesting solution. If you can't run your aplication as root, you may set raw socket capability on java:

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

And then ICMP protocol will be used istead of echo request on 7 TCP port.



来源:https://stackoverflow.com/questions/4779367/problem-with-isreachable-in-inetaddress-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!