IP-адрес недоступен

Я пытаюсь узнать, доступен ли IP-адрес, используя приведенный ниже код. Но каждый раз я получаю сообщение «Недоступно», хотя машина работает. Я пытался использовать несколько живых IP-адресов, но всегда получаю сообщение «Недоступно». Пожалуйста помоги.

public class CheckIP {
public static void main(String args[]) throws UnknownHostException, IOException{
    String ip = "78.46.84.171";

    if(InetAddress.getByName(ip).isReachable(100)){
        System.out.println("Reachable.");
    }
    else{
        System.out.println("Not Reachable.");
    }
}
}

person user3162879    schedule 03.06.2015    source источник


Ответы (1)


Можете ли вы пропинговать машину из командной строки? Например. ping 78.46.84.171?

Согласно документам Oracle:

Проверьте, доступен ли этот адрес. Реализация прилагает все усилия, чтобы попытаться связаться с хостом, но брандмауэры и конфигурация сервера могут блокировать запросы, что приводит к статусу недостижимости, в то время как некоторые определенные порты могут быть доступны. Типичная реализация будет использовать ICMP ECHO REQUEST, если привилегия может быть получена, в противном случае она попытается установить TCP-соединение на порту 7 (Echo) хоста назначения.

Значение тайм-аута в миллисекундах указывает максимальное количество времени, которое должно занять попытка. Если время ожидания операции истекает до получения ответа, хост считается недоступным. Отрицательное значение приведет к возникновению исключения IllegalArgumentException.

Подводя итог возможным ошибкам:

  • Блокирует ли брандмауэр запросы ICMP? (см. команду ping выше)
  • Возможно, ваш тайм-аут с 100 ms слишком короткий (попробуйте увеличить, например, до 1000)
  • Вы используете Linux/Mac? Возможно, вам не хватает прав для проверки связи, поэтому реализация isReachable(int) пытается установить TCP-соединение, но терпит неудачу. (попробуйте машину с Windows или запустите свою программу как root или через sudo)
person bratkartoffel    schedule 03.06.2015
comment
Обратите внимание на «если привилегия может быть получена». Обычно не может. А исправление Windows не использует ICMP. Таким образом, типичная реализация действительно использует TCP-порт 7. - person user207421; 03.06.2015