Я использую 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!
Обновлено в ответ на комментарий о том, что это неправильно:
Использование 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), чтобы подтвердить, что на самом деле происходит в сети.
Правильный ответ на самом деле не совсем верен. Microsoft.com просто игнорирует ICMP-запросы, вероятно, чтобы избежать основных атак ping flood. Что касается второго хоста, я понятия не имею, в чем может быть проблема с пингом, но я использую GNU/Linux, и isReachable работает просто отлично.