У Java-программы нет переносимого способа изменить эффективный идентификатор пользователя;то есть перейти от работы с привилегиями root к другому пользователю.(И даже в C приложение не может переключаться между привилегированным и непривилегированным суетой. Смена привилегий - это улица с односторонним движением.)
Чтение javadoc для InetAddress.isReachable
использует различные механизмы в зависимости от привилегии процесса JVM.Однако ни один из двух подходов, используемых isReachable
, не гарантированно сработает;например,
- некоторые брандмауэры могут выборочно блокировать сообщения ICMP ECHO,
- на целевой машине может не работать служба Echo на порту 7 ... или порт 7 может быть заблокирован брандмауэром.
Таким образом, я бы полностью решил проблему.Просто попробуйте сделать то, что вы действительно пытаетесь сделать , и забудьте об использовании isReachable
.Или, если это под вашим контролем, исправьте машины / сети так, чтобы оба механизма работали на машинах, которые вы хотите протестировать.
@ Geek - вы говорите, что не можете тестировать определенные порты, потому что ониможет быть заблокирован. все, что может быть заблокировано, включая ICMP PING, ICMP ECHO и все, что вы можете использовать для проверки доступности хоста.
Есть только одна вещь, которая действительно имеет значение: можете ли вы поговорить с сервисом, который вы фактически собираетесь использовать.И есть только один способ выяснить это: попробуйте использовать его.
Или, если сказать по-другому, проверка наличия хоста не имеет смысла.Хозяева не доступны: специальные услуги.