2012-02-15 78 views
6

我遇到了Windows上已知的Java 6 bug。我的理解是,獲取網絡掩碼的正常方式是查找網絡前綴長度並做一些轉換。問題是,在Windows上,前綴長度通常不正確地返回,所以當我們得到24或20時,我們得到128.Java和Windows 7:可靠地獲取IPv4網絡掩碼?

this solution中,建議將-Djava.net.preferIPv4Stack=true放在Java命令行上。不幸的是,在Windows 7上,添加VM參數或Java命令行似乎沒有任何作用。 (a)有沒有人知道任何其他解決方法可能仍然適用於Windows 7的這個問題?

(b)或者,是否有一種完全不同的方法來獲得可靠的網絡掩碼?

謝謝!

P.S. Here is the bug report that pertains to this

+0

適當的禮儀規定我列出了其他地方,我問過這個問題:http://stackoverflow.com/questions/9299566/java-windows-7-reliably-getting-ipv4-netmask http:// www。 codeguru.com/forum/showthread.php?t=521196 https://forums.oracle.com/forums/thread.jspa?threadID=2347643&tstart=0 http://www.coderanch.com/t/567601/ sockets/java/Java-Windows-Reliable-getting-IPv – 2012-02-16 17:00:48

+1

奇怪的是...... -Djava.net.preferIPv4Stack = true'虛擬機選項在我的情況下在Windows 7下適用於JRE 1.6。我把它作爲'System.setProperty(「java.net.preferIPv4Stack」,「true」)'放在我的Java代碼中。除非,(庫或其他)重置它。你可以顯示你的IP網絡掩碼? – ecle 2012-02-19 17:18:01

+0

感謝您的代碼行。我使用Netbeans,並且有一個地方可以放置VM選項。我試着把-D放在那裏。不行。我還使用Advanced Installer創建的包裝啓動應用程序,並且可以放置命令行選項。那也行不通。我將嘗試您的建議,在我的主要方法的頂部添加該行代碼。謝謝! – 2012-02-19 19:01:57

回答

3

-Djava.net.preferIPv4Stack=true虛擬機選項應該在任何操作系統下工作。或者,它可以作爲System.setProperty("java.net.preferIPv4Stack","true");放入Java代碼中。除非(庫或其他)重置其真實狀態。

1

由於問題我們只是在Windows 7中,爲什麼不尋找一個操作系統特定的解決方案? 我知道我們可以從Java啓動Windows程序,包括Windows命令行或bat文件。必須有一種方法可以將ipconfig的輸出重定向到Windows中的文本文件。您的程序應該能夠通過調用ipconfig並讀取輸出來獲取子網掩碼。

+0

嗯,我們在Win7中看到它,但是Sun的bug並不是那麼具體。無論如何,相同的解決方案應該適用於任何版本的Windows。我必須學習如何檢查操作系統類型,啓動外部程序並捕獲其輸出。然後,作爲獎勵,也許可以使用一些聰明的正則表達式來解析結果(而不是編寫自定義代碼來逐個字符地解析它)。 – 2012-02-19 15:27:56

2

下面的代碼顯示了子網掩碼。在具有多個網絡連接的計算機上(如具有無線和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

當我關掉我的無線連接,我只看到一條線如預期的那樣,用於有線以太網鏈路的輸出。

+0

這是一個非常好的答案,雖然上面eee的評論給了我可移植的答案。現在我對如何處理賞金感到厭倦。 – 2012-02-20 20:25:26

+0

上面的代碼是可移植的,因爲您可以輕鬆編寫代碼塊來處理不同的操作系統版本。如果您只需要Windows 7的此修復程序,那麼上面的代碼就是您想要的。 – Thorn 2012-02-21 05:30:42