2012-02-15 15 views
6

Ho incontrato un bug noto con Java 6 su Windows. La mia comprensione è che il modo normale per ottenere la maschera di rete è di cercare la lunghezza del prefisso di rete e fare alcuni cambiamenti di bit. Il problema è che su Windows la lunghezza del prefisso è spesso restituito in modo non corretto, in modo da ottenere un 128 in cui dovremmo ottenere un 24 o 20.Java e Windows 7: ottenendo in modo affidabile la maschera di rete IPv4?

In this solution, si suggerisce di mettere -Djava.net.preferIPv4Stack=true nella riga di comando Java. Sfortunatamente, su Windows 7, l'aggiunta di questo come parametro VM o sulla riga di comando di Java sembra non avere alcun effetto.

(a) Qualcuno conosce qualche altro intervento di questo problema che potrebbe ancora funzionare su Windows 7?

(b) In alternativa, esiste un modo completamente diverso per ottenere una maschera di rete affidabile?

Grazie!

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

+0

Un'etichetta corretta impone di elencare altri luoghi in cui ho posto questa domanda: http://stackoverflow.com/questions/9299566/java-windows-7-reliable-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/ socket/java/Java-Windows-Affidabilità-acquisizione-IPv –

+1

Strana ... l'opzione VM '-Djava.net.preferIPv4Stack = true' funziona nel mio caso con Windows 7 per JRE 1.6. Ho inserito questo nel mio codice Java come 'System.setProperty (" java.net.preferIPv4Stack "," true ")'. A meno che qualcosa (libreria o qualsiasi altra cosa) lo stia ripristinando. Puoi mostrare i tuoi codici di maschera di rete IP? – ecle

+0

Grazie per quella riga di codice. Sto usando Netbeans e c'è un posto dove mettere le opzioni della macchina virtuale. Ho provato a mettere la cosa-D lì. Non andare. Sto anche lanciando l'applicazione utilizzando un wrapper creato da Advanced Installer, e c'è posto per mettere le opzioni della riga di comando. Neanche questo ha funzionato. Vado a provare il tuo suggerimento, aggiungendo quella linea di codice nella parte superiore del mio metodo principale. Grazie! –

risposta

3

L'opzione VM -Djava.net.preferIPv4Stack=true dovrebbe funzionare con qualsiasi sistema operativo. In alternativa, può essere inserito nel codice Java come System.setProperty("java.net.preferIPv4Stack","true");. A meno che qualcosa (libreria o qualsiasi altra cosa) stia ripristinando il suo vero stato.

1

Poiché il problema ci riguarda solo in Windows 7, perché non cercare una soluzione specifica per il sistema operativo? So che possiamo avviare i programmi Windows da Java, inclusi i comandi da riga di comando di Windows o bat. Ci deve essere un modo per reindirizzare l'output di ipconfig in un file di testo in windows. Il tuo programma dovrebbe essere in grado di ottenere la subnet mask chiamando ipconfig e quindi leggendo l'output.

+0

Bene, lo stiamo vedendo in Win7, ma il bug di Sun non è così specifico. In ogni caso, la stessa soluzione dovrebbe funzionare su qualsiasi versione di Windows.Devo imparare come controllare il tipo di OS, attivare un programma esterno e catturarne l'output. E poi come bonus, magari usare qualche cosa regex intelligente per analizzare il risultato (piuttosto che scrivere codice personalizzato per analizzarlo char-by-char). –

2

Il codice seguente mostra la subnet mask. Su un computer con più di una connessione di rete (come un computer portatile con una connessione Ethernet wireless e Cat-5) è possibile scrivere la subnet mask due volte perché possono esistere due diversi indirizzi IP per il client.

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) { } 

Sul mio portatile sia con una connessione cablata e wireless attiva, ottengo questo output: 255.255.254.0 255.255.254.0

quando spengo la mia connessione wireless, vedo solo una riga di uscita per il collegamento Ethernet cablato, come previsto.

+0

Questa è davvero una bella risposta, anche se un commento di eee sopra mi ha dato la risposta portatile. Ora sono combattuto su come gestire la taglia. –

+0

Il codice sopra riportato è portatile nel senso che è possibile scrivere facilmente blocchi di codice per gestire diverse versioni del sistema operativo. Se hai solo bisogno di questa correzione per Windows 7, il codice sopra è quello che vuoi. – Thorn

Problemi correlati