web-dev-qa-db-fra.com

Comment obtenir un masque de sous-réseau d'un système local utilisant Java?

Comment obtenir l'adresse du masque Subnet du système local en utilisant la programmation Java?

18
user149621

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.

25
dfa

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)

5
mas

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();
4
Mr.Dohai

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.

3
FofBorg

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;
}
2
Israel Jimenez

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;
}
2
infografnet

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.

2
tak

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.

1
James Synge

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;
1
Interkot
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.

0
Preetam Kumar