Java & Windows 7: надежно получить маску IPv4? - PullRequest
6 голосов
/ 15 февраля 2012

Я столкнулся с известной ошибкой в ​​Java 6 в Windows. Насколько я понимаю, обычный способ получить маску сети - это посмотреть длину префикса сети и сделать несколько битовых сдвигов. Проблема в том, что в Windows длина префикса часто возвращается неверно, поэтому мы получаем 128, когда мы должны получить 24 или 20.

В в этом решении предлагается поставить -Djava.net.preferIPv4Stack=true в командной строке Java. К сожалению, в Windows 7 добавление этого параметра в качестве параметра виртуальной машины или командной строки Java, похоже, не имеет никакого эффекта.

(a) Кто-нибудь знает ДРУГИЕ обходные пути для этой проблемы, которые могут все еще работать в Windows 7?

(b) В качестве альтернативы, есть ли совершенно другой способ получить надежную сетевую маску?

Спасибо!

P.S. Вот отчет об ошибке, относящийся к этому .

Ответы [ 3 ]

3 голосов
/ 21 февраля 2012

Параметр -Djava.net.preferIPv4Stack=true VM должен работать под любой ОС. В качестве альтернативы, его можно поместить в код Java как System.setProperty("java.net.preferIPv4Stack","true");. Если что-то (библиотека или что-то еще) не сбрасывает свое истинное состояние.

2 голосов
/ 20 февраля 2012

Приведенный ниже код отображает маску подсети. На компьютере с несколькими сетевыми подключениями (например, на ноутбуке с беспроводным подключением и Ethernet-соединением Cat-5) он может записать маску подсети дважды, поскольку для клиента может быть два разных IP-адреса.

    String os = System.getProperty("os.name");        
    try {
        if(os.indexOf("Windows 7")>=0) {
            Process process = Runtime.getRuntime().exec("ipconfig");
            process.waitFor();
            InputStream commandOut= process.getInputStream();

            BufferedReader in = new BufferedReader(new InputStreamReader(commandOut));
            String line;
            while((line = in.readLine()) !=null) {
                if(line.indexOf("Subnet Mask")>=0) {
                    int colon = line.indexOf(":");
                    System.out.println(line.substring(colon+2));
                }
            }
        }
    catch(IOException ioe) {    }
    catch(java.lang.InterruptedException utoh) {   }

На моем ноутбуке с активным проводным и беспроводным подключением я получаю следующий вывод: 255.255.254.0 255.255.254.0

Когда я отключаю беспроводное соединение, я вижу только одну линию вывода для проводного соединения Ethernet, как и ожидалось.

1 голос
/ 19 февраля 2012

Поскольку проблема используется только в Windows 7, почему бы не найти решение для конкретной ОС?Я знаю, что мы можем запускать программы для Windows из Java, включая командную строку Windows или файлы bat.Должен быть способ перенаправить вывод ipconfig в текстовый файл в windows.Ваша программа должна иметь возможность получить маску подсети, вызвав ipconfig и затем прочитав вывод.

...