Comment obtenir l'adresse du masque Subnet
du système local en utilisant la programmation Java?
le masque de réseau de la première adresse de l'interface localhost:
InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
une approche plus complète:
InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
for (InterfaceAddress address : networkInterface.getInterfaceAddresses()) {
System.out.println(address.getNetworkPrefixLength());
}
/ 24 signifie 255.255.255.
Java.net.InterfaceAddress dans SE6 a une méthode getNetworkPrefixLength qui renvoie, comme son nom l’indique, la longueur du préfixe réseau. Vous pouvez calculer le masque de sous-réseau à partir de ceci si vous préférez l'avoir dans ce format. Java.net.InterfaceAddress prend en charge IPv4 et IPv6.
getSubnetMask () dans plusieurs API d'application réseau renvoie un masque de sous-réseau sous la forme Java.net.InetAddress pour l'adresse IP spécifiée (un système local peut avoir plusieurs adresses IP locales)
Je l'ai trouvé:
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
Pour obtenir le masque de sous-réseau pour ipv6, nous pouvons utiliser:
networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
Pour obtenir un masque de sous-réseau pour ipv4, nous pouvons utiliser:
networkInterface.getInterfaceAddresses().get(1).getNetworkPrefixLength();
J'ai conçu une solution uniquement IPv4 qui est assez simple. J'avais besoin de cela pour générer le masque de réseau pour les sous-réseaux ici afin de déléguer ces sous-réseaux correctement. Je sais que j'aurais pu générer un tableau des 32 masques possibles, mais j'ai préféré le calculer à chaque fois.
Alors voici ma solution.
/*
* 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;
}
Vous appelez juste cela avec l'IP et le préfixe que vous voulez utiliser, cela va générer le masque de réseau pour vous.
En résumé, une méthode pour obtenir le masque serait la suivante:
public String mascara() throws SocketException{
try{
InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
prefijo =
""+networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
int shft = 0xffffffff<<(32-
networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength());
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;
mascara = oct1+"."+oct2+"."+oct3+"."+oct4;
// System.out.println(""+mascara);
}catch(UnknownHostException e){
System.out.println("Error: "+e);
}
return mascara;
}
Voici une réponse, comment obtenir un sous-masque à partir d'une connexion WIFI: link
Je l'ai adapté à mes besoins, et le voici:
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;
}
Je viens de finir de travailler sur une API pour les réseaux de sous-réseaux avec Java.
https://launchpad.net/subnettingapi
il a cette fonctionnalité et plus encore.
FWIW, j’avais déjà essayé d’utiliser InterfaceAddress.getNetworkPrefixLength () et InterfaceAddress.getBroadcast (), mais ils ne renvoient pas d’informations précises (sous Windows, avec Sun JDK 1.6.0 update 10). La longueur du préfixe du réseau est 128 (et non 24, ce qui est sur mon réseau) et l'adresse de diffusion renvoyée est 255.255.255.255 (et non 192.168.1.255, ce qui est sur mon réseau).
James
Mise à jour: je viens de trouver la solution publiée ici:
http://forums.Sun.com/thread.jspa?threadID=5277744
Vous devez empêcher Java d'utiliser IPv6 afin d'éviter tout accès à IPv4 via IPv6. L'ajout de -Djava.net.preferIPv4Stack = true à la ligne de commande corrige les résultats obtenus avec InterfaceAddress.getNetworkPrefixLength () et InterfaceAddress. .getBroadcast () pour moi.
Vous pouvez convertir la valeur obtenue au format texte standard comme ceci:
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;
String local=InetAddress.getLocalHost().getHostAddress();
String[] ip_component = local.split("\\.");
String subnet=ip_component[0]+"."+ip_component[1]+"."+ip_component[2]+".";
Cela a fonctionné pour moi. Ici, la variable sous-réseau a l'adresse du sous-réseau.