isReachable в Java, похоже, не работает так, как он должен - PullRequest
5 голосов
/ 06 мая 2010

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

Я пытаюсь реализовать функцию ping, используя isReachable. Код, который я использую, это:

(.isReachable (java.net.InetAddress/getByName "www.microsoft.com") 5000)

Переведено на Java моим хорошим другом:

public class NetTest {
  public static void main (String[] args) throws Exception{
    String host = "acidrayne.net";
    InetAddress a = InetAddress.getByName(host);

    System.out.println(a.isReachable(10000));
  }
}

Оба они возвращают false. Полагаю, я ошибаюсь, но исследования Google говорят мне по-другому. Я в замешательстве!

Ответы [ 2 ]

3 голосов
/ 06 мая 2010

Обновлено в ответ на комментарий, что это неправильно:

Использование Unix / Linux ??

http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html говорит:

Linux / Unix, напротив, поддерживает системный вызов ICMP "ping". Поэтому реализация java.net.InetAddress.isReachable () сначала пытается выполнить системный вызов "ping" **; если это не удается, отступает, пытаясь открыть сокет TCP на [sic-to] порту 7 , как в Windows.

Оказывается, что в Linux / Unix системный вызов ping требует привилегий root , поэтому в большинстве случаев java.net.InetAddress.isReachable () завершится ошибкой, поскольку многие Java-программы не запускаются как root , а из-за целевой адрес вряд ли имеет службу эха и работает . Жаль.

Комментарий ниже от @EJP указывает, что часть службы echo неверна, неверна неверна:

Это не правильно. isReachable возвращает true, если получает ConnectException при попытке подключения к порту 7, поскольку это доказывает, что хост работает и может отправлять сегменты RST.

В подобных случаях я использую анализатор пакетов, например WireShark, tcpdump (WinDump в Windows) или snoop (Solaris), чтобы подтвердить, что действительно происходит на проводе.

1 голос
/ 06 мая 2010

Правильный ответ на самом деле не правильный, я думаю. Microsoft.com просто игнорирует запросы ICMP, вероятно, чтобы избежать основных атак ping-потока. Что касается второго хоста, я понятия не имею, в чем может быть проблема с пингом, но я использую GNU / Linux, и isReachable прекрасно работает.

...