Come ottenere la subnet mask del sistema locale usando java?

Come ottenere l’indirizzo della Subnet mask del sistema locale utilizzando la programmazione Java?

la maschera di rete del primo indirizzo dell’interfaccia localhost:

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

un approccio più 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 in SE6 ha un metodo getNetworkPrefixLength che restituisce, come suggerisce il nome, la lunghezza del prefisso di rete. È ansible calcolare la subnet mask da questo se si preferisce averlo in quel formato. java.net.InterfaceAddress supporta sia IPv4 che IPv6.

getSubnetMask () in diverse API delle applicazioni di rete restituisce la subnet mask nel modulo java.net.InetAddress per l’indirizzo IP specificato (un sistema locale può avere molti indirizzi IP locali)

L’ho trovato:

 NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost); 

Per ottenere la subnet mask per ipv6 possiamo usare:

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

Per ottenere la subnet mask per ipv4 possiamo usare:

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

Ho ideato una soluzione solo IPv4 che sia abbastanza semplice. Avevo bisogno di questo per generare maschera di rete per sottoreti qui per debind correttamente quelle sottoreti. So che avrei potuto generare una tabella delle 32 possibili maschere, ma ho preferito ottenerlo calcolato ogni volta.

Quindi ecco la mia soluzione.

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

Basta chiamarlo con l’IP e il prefisso che vuoi usare, genererà la maschera di rete per te.

Ho appena finito di lavorare su un’API per subnetting di reti con Java.

https://launchpad.net/subnettingapi

ha quella funzionalità e altro ancora.

FWIW, in passato avevo provato a utilizzare InterfaceAddress.getNetworkPrefixLength () e InterfaceAddress.getBroadcast (), ma non restituiscono informazioni accurate (questo è su Windows, con Sun JDK 1.6.0 update 10). La lunghezza del prefisso di rete è 128 (non 24, che è sulla mia rete), e l’indirizzo di broadcast restituito è 255.255.255.255 (non 192.168.1.255, che è sulla mia rete).

Giacomo

Aggiornamento: ho appena trovato la soluzione pubblicata qui:

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

È necessario impedire a Java di utilizzare IPv6, in modo che non possa accedere a IPv4 tramite IPv6. L’aggiunta di -Djava.net.preferIPv4Stack = true alla riga di comando corregge i risultati da InterfaceAddress.getNetworkPrefixLength () e InterfaceAddress.getBroadcast () per me.

Ecco una risposta, come ottenere una sottomaschera dalla connessione WIFI: link

L’ho adattato per i miei bisogni, ed eccolo qui:

 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]+"."; 

Questo ha funzionato per me. qui la subnet variabile ha l’indirizzo di substring.

Puoi convertire il valore ottenuto nel formato testuale standard come questo:

 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;