6

Windows 上の Java 6 で既知のバグに遭遇しました。私の理解では、ネットマスクを取得する通常の方法は、ネットワーク プレフィックスの長さを調べて、いくつかのビット シフトを行うことです。問題は、Windows ではプレフィックス長が正しく返されないことが多いため、24 または 20 を取得する必要があるときに 128 を取得することです。

このソリューションでは-Djava.net.preferIPv4Stack=true、Java コマンド ラインを使用することをお勧めします。残念ながら、Windows 7 では、それを VM パラメータとして、または Java コマンド ラインに追加しても効果がないようです。

(a) Windows 7 でも動作する可能性がある、この問題に対するその他の回避策を知っている人はいますか?

(b) あるいは、信頼できるネットマスクを取得するまったく別の方法はありますか?

ありがとう!

PS これに関連するバグレポートは次のとおりです。

4

3 に答える 3

3

VM オプションは、-Djava.net.preferIPv4Stack=trueどの OS でも機能するはずです。または、Java コードに として配置することもできますSystem.setProperty("java.net.preferIPv4Stack","true");。何か(ライブラリなど)がその真の状態をリセットしていない限り。

于 2012-02-20T22:45:02.763 に答える
2

以下のコードは、サブネット マスクを表示します。複数のネットワーク接続を持つコンピュータ (ワイヤレスおよび Cat-5 イーサネット接続を持つラップトップなど) では、クライアントに 2 つの異なる IP アドレスが存在する可能性があるため、サブネット マスクが 2 回書き込まれることがあります。

    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

ワイヤレス接続をオフにすると、予想どおり、有線イーサネット リンクの出力が 1 行しか表示されません。

于 2012-02-20T05:54:16.230 に答える
1

問題は Windows 7 だけにあるので、OS 固有の解決策を探してみませんか? Windows コマンド ラインやバッチ ファイルなど、Java から Windows プログラムを起動できることはわかっています。ipconfig の出力を Windows のテキスト ファイルにリダイレクトする方法が必要です。プログラムは、ipconfig を呼び出して出力を読み取ることにより、サブネット マスクを取得できるはずです。

于 2012-02-19T15:04:40.273 に答える