¿Cómo obtener la máscara de subred del sistema local usando java?

¿Cómo obtener la dirección de la máscara de Subnet del sistema local utilizando la progtwigción de Java?

la máscara de red de la primera dirección de la interfaz localhost:

 InetAddress localHost = Inet4Address.getLocalHost(); NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost); networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength(); 

un enfoque más completo:

 InetAddress localHost = Inet4Address.getLocalHost(); NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost); for (InterfaceAddress address : networkInterface.getInterfaceAddresses()) { System.out.println(address.getNetworkPrefixLength()); } 

/ 24 significa 255.255.255.

java.net.InterfaceAddress en SE6 tiene un método getNetworkPrefixLength que devuelve, como su nombre indica, la longitud del prefijo de red. Puede calcular la máscara de subred desde aquí si prefiere tenerla en ese formato. java.net.InterfaceAddress admite tanto IPv4 como IPv6.

getSubnetMask () en varias API de aplicaciones de red devuelve máscara de subred en formato java.net.InetAddress para la dirección IP especificada (un sistema local puede tener muchas direcciones IP locales)

Encontre eso:

 NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost); 

Para obtener subnetmask para ipv6 podemos usar:

  networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength(); 

Para obtener subnetmask para ipv4 podemos usar:

 networkInterface.getInterfaceAddresses().get(1).getNetworkPrefixLength(); 

Ideé una solución solo IPv4 que es lo suficientemente simple. Lo necesitaba para generar una máscara de red para subredes aquí para delegar esas subredes correctamente. Sé que podría haber generado una tabla de las 32 máscaras posibles, pero preferí que se compute cada vez.

Así que aquí está mi solución.

 /* * Get network mask for the IP address and network prefix specified... * The network mask will be returned has an IP, thus you can * print it out with .getHostAddress()... */ public static InetAddress getIPv4LocalNetMask(InetAddress ip, int netPrefix) { try { // Since this is for IPv4, it's 32 bits, so set the sign value of // the int to "negative"... int shiftby = (1<<31); // For the number of bits of the prefix -1 (we already set the sign bit) for (int i=netPrefix-1; i>0; i--) { // Shift the sign right... Java makes the sign bit sticky on a shift... // So no need to "set it back up"... shiftby = (shiftby >> 1); } // Transform the resulting value in xxx.xxx.xxx.xxx format, like if /// it was a standard address... String maskString = Integer.toString((shiftby >> 24) & 255) + "." + Integer.toString((shiftby >> 16) & 255) + "." + Integer.toString((shiftby >> 8) & 255) + "." + Integer.toString(shiftby & 255); // Return the address thus created... return InetAddress.getByName(maskString); } catch(Exception e){e.printStackTrace(); } // Something went wrong here... return null; } 

Simplemente lo llama con la IP y el prefijo que desea usar, generará la máscara de red para usted.

Acabo de terminar de trabajar en una API para redes de subredes con Java.

https://launchpad.net/subnettingapi

tiene esa funcionalidad y más.

FWIW, en el pasado había intentado usar InterfaceAddress.getNetworkPrefixLength () y InterfaceAddress.getBroadcast (), pero no devuelven información precisa (esto es en Windows, con Sun JDK 1.6.0 actualización 10). La longitud del prefijo de red es 128 (no 24, que está en mi red), y la dirección de difusión devuelta es 255.255.255.255 (no 192.168.1.255, que está en mi red).

James

Actualización: acabo de encontrar la solución publicada aquí:

  http://forums.sun.com/thread.jspa?threadID=5277744 

Debe evitar que Java use IPv6, de modo que no llegue a IPv4 a través de IPv6. Agregar -Djava.net.preferIPv4Stack = verdadero a la línea de comando corrige los resultados de InterfaceAddress.getNetworkPrefixLength () y InterfaceAddress.getBroadcast () para mí.

Aquí hay una respuesta, cómo obtener una submascara de la conexión WIFI: enlace

Lo adapté para mis necesidades, y aquí está:

 private static String intToIP(int ipAddress) { String ret = String.format("%d.%d.%d.%d", (ipAddress & 0xff), (ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff)); return ret; } public static String GetSubnetMask_WIFI() { WifiManager wifiManager = (WifiManager) Global.getMainActivity() .getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); DhcpInfo dhcp = wifiManager.getDhcpInfo(); String mask = intToIP(dhcp.netmask); return mask; } 
 String local=InetAddress.getLocalHost().getHostAddress(); String[] ip_component = local.split("\\."); String subnet=ip_component[0]+"."+ip_component[1]+"."+ip_component[2]+"."; 

Esto funcionó para mí. aquí la subred variable tiene la dirección de subred.

Puede convertir el valor obtenido en el formato de texto estándar como este:

 short prflen=...getNetworkPrefixLength(); int shft = 0xffffffff<<(32-prflen); int oct1 = ((byte) ((shft&0xff000000)>>24)) & 0xff; int oct2 = ((byte) ((shft&0x00ff0000)>>16)) & 0xff; int oct3 = ((byte) ((shft&0x0000ff00)>>8)) & 0xff; int oct4 = ((byte) (shft&0x000000ff)) & 0xff; String submask = oct1+"."+oct2+"."+oct3+"."+oct4;