Problem with isReachable in InetAddress class

前端 未结 3 1152
你的背包
你的背包 2020-12-03 17:51

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

相关标签:
3条回答
  • 2020-12-03 18:22

    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;
        }
    }
    
    0 讨论(0)
  • 2020-12-03 18:40

    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.

    0 讨论(0)
  • 2020-12-03 18:42

    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.

    0 讨论(0)
提交回复
热议问题