Проблема с 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;
}
}