isReachable()
будет использовать ICMP ECHO REQUEST
s , если привилегия может быть получена , в противном случае он попытается установить TCP-соединение через порт 7 (Echo) хоста назначения.
Таким образом, ваша проблема, вероятно, связана с проблемой конфигурации, связанной с недостаточным количеством разрешений для этого на клиентском компьютере, или с проблемой порта 7 на сервере, если у вашего клиента нет разрешения на ICMP ECHO REQUEST
. Возможно, в обоих случаях вам нужно разрешить одну или другую сторону, чтобы заставить это работать.
Я протестировал следующее на клиентах OSX и Linux, и оно работает при тестировании на доступность других машин с OSX, Linux и Windows Server. У меня нет компьютера под управлением Windows, чтобы запустить его в качестве клиента.
import java.io.IOException;
import java.net.InetAddress;
public class IsReachable
{
public static void main(final String[] args) throws IOException
{
final InetAddress host = InetAddress.getByName(args[0]);
System.out.println("host.isReachable(1000) = " + host.isReachable(1000));
}
}
из того, что я прочитал здесь . Это, очевидно, ограничение Windows, и ICMP PING
не поддерживается в Windows как системный вызов, предшествующий Windows 2000, поэтому по умолчанию он пытается подключиться к порту 7, и он заблокирован на машине, к которой вы пытаетесь «добраться». Java пока не поддерживает новый системный вызов. Функция прав доступа предназначена для систем на основе Unix, так как они требуют, чтобы root отправлял ICMP
пакетов.
Если вы хотите свернуть свой собственный Windows JNI ICMP PING
для Windows 2000 и новее, есть функция IcmpSendEcho .