Тайм-аут Java InetAddress.isReachable () - PullRequest
8 голосов
/ 04 марта 2012

Я пытаюсь выяснить, доступны ли определенные хосты в моей сети.Мой java-код выглядит следующим образом:

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

Это работает довольно хорошо, однако, если я уменьшу время ожидания до 500 мс, оно не будет обозначать хост, доступный больше.Я планирую проверить несколько хостов в цикле, поэтому очень важно иметь малое время ожидания.Если я пингую хост вручную из командной строки Windows, это займет менее 10 мс.

Так почему же для успеха метода Java требуется гораздо более длительное время ожидания?Есть ли альтернативы использованию isReachable()?

1 Ответ

6 голосов
/ 04 марта 2012

Это зависит от того, что вы подразумеваете под достижимостью. Если вы обнаружите, что доступные хосты прослушивают определенные порты, вы можете открыть сокет-соединение с этим портом (например, найти все HTTP-серверы, проверив порт 80). Использование InetAddress.isReachable () зависит от реализации. Согласно Javadoc, "Типичная реализация будет использовать ICMP ECHO REQUESTs". Проверка «известного порта» (например, http (80), smb (445) и т. Д.) С использованием Java NIO (неблокирующий ввод / вывод) может иметь более высокую производительность. У моей компании есть продукт, который использует сканирование «известного порта» для поиска ящиков с Telnet или SSH, используя NIO, и мы можем сканировать около 5000 IP / сек.

...