Проблема с isReachable в классе InetAddress

В качестве задания мне нужно найти все живые компьютеры в локальной сети. Для чего я использую isReachable функцию класса InetAddress. Но проблема в том, что мне ничего не видно. Поэтому я пытался использовать isReachable с помощью Google IP, но это недостижимо.

Вот код:

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

Ответ 1

Вот некоторые подробности о том, почему isReachable() может не всегда работать как ожидалось

Правильный путь для вас - использовать протокол ICMP. Полагаю, это то, что ping использует. Вот пример, с которого вы начали.

Ответ 2

Я нашел интересное решение. Если вы не можете запустить приложение в качестве пользователя root, вы можете установить raw socket на java:

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

И тогда ICMP-протокол будет использоваться istead эхо-запроса на 7-порте TCP.

Ответ 3

Вот код, который независим от платформы, но требует информации о любом открытом порту на другом компьютере (который мы имеем большую часть времени).

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