Как сделать истинный ping Java из Windows?

В поле «Авторизованные перенаправления URI» есть текст справки, в котором четко указано, что вы не можете использовать общедоступные IP-адреса:

Авторизованные URI-адреса перенаправления

Для использования с запросами с веб-сервера. Это путь в приложении, к которому пользователи перенаправляются после того, как они прошли аутентификацию с помощью Google. Путь будет добавлен с помощью кода авторизации для доступа. Должен иметь протокол. Не может содержать фрагменты URL или относительные пути. Не может быть общедоступным IP-адресом.

blockquote>

127.0.0.1 не является общедоступным IP, но loopback , поэтому http://127.0.0.1/ callback работает нормально. localhost также можно использовать: http: // localhost / callback

За исключением привязки общего домена верхнего уровня к моему серверу, что еще я могу сделать?

blockquote>

Вы можете использовать бесплатный DNS с помощью http://xip.io/ . Поэтому для IP 99.99.99.99 используйте http://99.99.99.99.xip.io/callback . И это будет разрешено http://99.99.99.99/callback .

28
задан Stephen Watkins 15 March 2010 в 19:39
поделиться

2 ответа

isReachable() будет использовать ICMP ECHO REQUEST с , если привилегия может быть получена , в противном случае он попытается установить 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 .

27
ответ дан 28 November 2019 в 03:30
поделиться

Я видел много плохого кода, написанного на эту тему. Код, который работал для меня, - это (сайт не знает, как правильно проанализировать мой файл кода):

public class Test {

    public static boolean isReachablebyPing(String ip) {

        try {
            String command;

        if(System.getProperty("os.name").toLowerCase().startsWith("windows")) {
            // For Windows
            command = "ping -n 2 " + ip;
        } else {
            // For Linux and OSX
            command = "ping -c 2 " + ip;
        }

        Process proc = Runtime.getRuntime().exec(command);
        StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");
        outputGobbler.start();

        proc.waitFor();
        return checkAvailability(outputGobbler.getOutputLines());

        } catch(IOException | InterruptedException ex) {
        Logger.getLogger(StreamGobbler.class.getName()).log(Level.SEVERE, null, ex);
        }

        return false;
    }

    public static void main(String... args) {

        String ip = "10.20.20.17";   // false in my case
        String ip1 = "10.20.20.100"; // true in my case

        System.out.println(ip + " is avalaible " + isReachablebyPing(ip));
        System.out.println(ip1 + " is avalaible " + isReachablebyPing(ip1));
    }

    private static boolean checkAvailability(List<String> outputLines) {

        for(String line : outputLines) {
            if(line.contains("unreachable")) {
                return false;
            }
            if(line.contains("TTL=")) {
                return true;
            }
        }
        return false;

    }

}

class StreamGobbler extends Thread {

    protected InputStream is;

    protected String type;

    protected List<String> outputLines;

    StreamGobbler(InputStream is, String type) {
        this.is = is;
        this.type = type;
        outputLines = new ArrayList<>();
    }

    public List<String> getOutputLines() {
        return outputLines;
    }

    @Override
    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line;
            while((line = br.readLine()) != null) {
                outputLines.add(line);
            }
        } catch(IOException ex) {
                Logger.getLogger(StreamGobbler.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}
1
ответ дан delavega66 28 November 2019 в 03:30
поделиться
Другие вопросы по тегам:

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