2012-03-04 12 views
8

Próbuję sprawdzić, czy określone hosty w mojej sieci są osiągalne. Mój kod Java jest w następujący sposób:Java InetAddress.isReachable() timeout

InetAddress adr = InetAddress.getByName(host); 
if(adr.isReachable(3000)){ 
    System.out.println(host + " is reachable"); 
} 

Działa to całkiem dobrze, jednak jeśli obniżyć limit czasu do powiedzenia zamiast 500ms, nie wyznacza już host nieosiągalny. Mam zamiar sprawdzić kilka hostów w pętli, więc posiadanie niskiego limitu czasu jest bardzo ważne. Jeśli wykonuję polecenie ping ręcznie hosta z wiersza poleceń systemu Windows, zajmuje to mniej niż 10 ms.

Dlaczego więc metoda Java wymaga znacznie wyższego czasu oczekiwania, aby odnieść sukces? Czy są jakieś alternatywy dla korzystania z isReachable()?

Odpowiedz

5

To zależy od tego, co masz na myśli przez osiągalność. Jeśli tylko znajdziesz dostępne hosty nasłuchujące na określonych portach, możesz otworzyć połączenie z gniazdem do tego portu (na przykład znaleźć wszystkie serwery HTTP, sprawdzając port 80). Używanie InetAddress.isReachable() zależy od implementacji. Zgodnie z javadoc: "Typowa implementacja będzie używać ICMP ECHO REQUESTs". Sprawdzanie "znanego portu" (jak http (80), smb (445), itp.) Za pomocą Java NIO (nie blokujące I/O) może mieć wyższą wydajność. Moja firma ma produkt, który korzysta ze skanowania "znanego portu" w celu znalezienia skrzynek z usługą Telnet lub SSH, za pomocą NIO, i możemy przeskanować około 5000 IP/s.

+0

Dzięki, Zasadniczo tak, chciałbym podłączyć/sprawdzić hosty na porcie 10001, które są używane przez urządzenia, które muszę znaleźć. Czy mógłbyś podać przykład, jak wdrożyć tę znaną kontrolę portu? – Jerome

+1

Nie wdaje się w implementację nieblokującej metody I/O (NIO). Ale powiedziałbym po prostu utworzyć gniazdo. Utwórz adres Socket z docelowym adresem IP i portem 10001. Następnie wywołaj socket.connect (SocketAddress, timeout) z odpowiednim limitem czasu. Catch TimeOutException. Jeśli socket.connect() zwraca się bez wyjątku, zamknij gniazdo, wiesz, że urządzenie nasłuchuje na 10001. Dla modelu NIO, spójrz na projekt Netty open-source i przykłady. – brettw