2012-02-15 15 views
6

Me he encontrado con un error conocido con Java 6 en Windows. Según entiendo, la forma normal de obtener la máscara de red es buscar la longitud del prefijo de la red y hacer algunos cambios de bit. El problema es que en Windows la longitud del prefijo a menudo se devuelve incorrectamente, por lo que obtenemos un 128 cuando debería obtener un 24 o 20.Java y Windows 7: ¿Obtienes con seguridad la máscara de red IPv4?

En this solution, se sugiere poner -Djava.net.preferIPv4Stack=true en la línea de comandos de Java. Desafortunadamente, en Windows 7, agregar eso como un parámetro de VM o en la línea de comandos de Java parece no tener ningún efecto.

(a) ¿Alguien sabe alguna OTRA solución alternativa para este problema que aún podría funcionar en Windows 7?

(b) Alternativamente, ¿hay alguna otra manera de obtener la máscara de red que sea confiable?

Gracias!

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

+0

La etiqueta adecuada dicta que enumero otros lugares donde he hecho esta pregunta: 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-Reliably-getting-IPv –

+1

Extraño ... la opción VM '-Djava.net.preferIPv4Stack = true' funciona en mi caso bajo Windows 7 para JRE 1.6. Puse esto en mi código Java como 'System.setProperty (" java.net.preferIPv4Stack "," true ")'. A menos que algo (la biblioteca o lo que sea) esté reiniciando. ¿Puedes mostrar tus códigos IP de máscara de red? – ecle

+0

Gracias por esa línea de código. Estoy usando Netbeans, y hay un lugar para poner opciones de VM. Intenté poner el -D allí. No vayas. También estoy lanzando la aplicación utilizando un contenedor creado por Advanced Installer, y hay lugar para poner opciones de línea de comandos. Eso tampoco funcionó. Voy a intentar tu sugerencia, agregando esa línea de código en la parte superior de mi método principal. ¡Gracias! –

Respuesta

3

La opción de máquina virtual -Djava.net.preferIPv4Stack=true debe funcionar con cualquier sistema operativo. Alternativamente, se puede poner en el código de Java como System.setProperty("java.net.preferIPv4Stack","true");. A menos que algo (biblioteca o lo que sea) esté restableciendo su verdadero estado.

1

Dado que el problema que tenemos solo en Windows 7, ¿por qué no buscar una solución específica del sistema operativo? Sé que podemos ejecutar programas de Windows desde Java, incluida la línea de comandos de Windows o los archivos bat. Debe haber una forma de redirigir la salida de ipconfig a un archivo de texto en Windows. Su programa debería poder obtener la máscara de subred llamando a ipconfig y luego leyendo el resultado.

+0

Bueno, lo estamos viendo en Win7, pero el error de Sun no es tan específico. En cualquier caso, la misma solución debería funcionar en cualquier versión de Windows.Tengo que aprender a verificar el tipo de SO, disparar un programa externo y capturar su salida. Y luego, como beneficio adicional, tal vez use algo inteligente de expresiones regulares para analizar el resultado (en lugar de escribir código personalizado para analizarlo char-by-char). –

2

El código siguiente muestra la máscara de subred. En una computadora con más de una conexión de red (como una computadora portátil con una conexión Ethernet inalámbrica y Cat-5), puede escribir la máscara de subred dos veces porque puede haber dos direcciones IP diferentes para el cliente.

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

En mi portátil con una conexión por cable e inalámbrica activa, me sale esta salida: 255.255.254.0 255.255.254.0

Cuando apago mi conexión inalámbrica, solo veo una línea de salida para el enlace Ethernet por cable, como se esperaba.

+0

Esa es una respuesta muy buena, aunque un comentario de eee anterior me dio la respuesta portátil. Ahora estoy desgarrado sobre cómo manejar la recompensa. –

+0

El código anterior es portátil en el sentido de que puede escribir fácilmente bloques de código para manejar diferentes versiones del sistema operativo. Si solo necesita esta solución para Windows 7, entonces el código anterior es lo que desea. – Thorn

Cuestiones relacionadas