Como obter a máscara de sub-rede do sistema local usando java?

Como obter o endereço da máscara de Subnet rede do sistema local usando a programação Java?

a máscara de rede do primeiro endereço da interface do host local:

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

uma abordagem mais completa:

 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 em SE6 tem um método getNetworkPrefixLength que retorna, como o nome sugere, o comprimento do prefixo de rede. Você pode calcular a máscara de sub-rede a partir disso, se preferir que ela esteja nesse formato. java.net.InterfaceAddress suporta IPv4 e IPv6.

getSubnetMask () em várias APIs do aplicativo de rede retorna a máscara de sub-rede no formato java.net.InetAddress para o endereço IP especificado (um sistema local pode ter muitos endereços IP locais)

Eu achei aquilo:

 NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost); 

Para obter a máscara de sub-rede para o ipv6, podemos usar:

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

Para obter a máscara de sub-rede para o ipv4, podemos usar:

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

Eu criei uma solução somente IPv4 que seja simples o suficiente. Eu precisava disso para gerar máscara de rede para sub-redes aqui para delegar essas sub-redes corretamente. Eu sei que eu poderia ter gerado uma tabela das 32 máscaras possíveis, mas eu preferi obtê-lo computado a cada vez.

Então aqui está a minha solução.

 /* * 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; } 

Você acabou de chamá-lo com o IP e o prefixo que você deseja usar, ele irá gerar a máscara de rede para você.

Acabei de terminar de trabalhar em uma API para redes de sub-redes com o Java.

https://launchpad.net/subnettingapi

tem essa funcionalidade e muito mais.

FWIW, no passado eu tentei usar InterfaceAddress.getNetworkPrefixLength () e InterfaceAddress.getBroadcast (), mas eles não retornam informações precisas (isso é no Windows, com o Sun JDK 1.6.0 atualização 10). O tamanho do prefixo da rede é 128 (não 24, que está na minha rede), e o endereço de broadcast retornado é 255.255.255.255 (não 192.168.1.255, que está na minha rede).

James

Atualização: Acabei de encontrar a solução postada aqui:

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

Você precisa impedir que o Java use o IPv6, para que ele não esteja chegando ao IPv4 via IPv6. Adicionando -Djava.net.preferIPv4Stack = true à linha de comando corrige os resultados de InterfaceAddress.getNetworkPrefixLength () e InterfaceAddress.getBroadcast () para mim.

Aqui está uma resposta, como obter uma sub-máscara de conexão Wi-Fi: link

Eu adaptei para as minhas necessidades e aqui 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]+"."; 

Isso funcionou para mim. aqui a sub-rede variável tem o endereço da sub-rede.

Você pode converter o valor obtido no formato textual padrão 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;