isReachable в Java, кажется, не работает вполне способ, которым он, как предполагается,

Я использую 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 говорит мне по-другому. Я - confuzzled!

5
задан Rayne 5 May 2010 в 22:31
поделиться

2 ответа

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

Использование 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 указывает, что часть о службе эха неверна, неверна неверна:

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

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

3
ответ дан 15 December 2019 в 00:53
поделиться

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

1
ответ дан 15 December 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: