it-swarm.com.de

Wie bekomme ich die Subnetzmaske des lokalen Systems mit Java?

Wie erhalte ich die Subnet Maskenadresse des lokalen Systems mithilfe der Java-Programmierung?

18
user149621

die Netzmaske der ersten Adresse der localhost-Schnittstelle:

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

ein vollständigerer Ansatz:

InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);

for (InterfaceAddress address : networkInterface.getInterfaceAddresses()) {
    System.out.println(address.getNetworkPrefixLength());
}

/ 24 bedeutet 255.255.255.

25
dfa

Java.net.InterfaceAddress in SE6 verfügt über eine getNetworkPrefixLength-Methode, die, wie der Name vermuten lässt, die Länge des Netzwerkpräfixes zurückgibt. Sie können die Subnetzmaske daraus berechnen, wenn Sie sie lieber in diesem Format haben möchten. Java.net.InterfaceAddress unterstützt sowohl IPv4 als auch IPv6.

getSubnetMask () in mehreren Netzwerkanwendungs-APIs gibt die Subnetzmaske im Java.net.InetAddress-Formular für die angegebene IP-Adresse zurück (ein lokales System kann viele lokale IP-Adressen haben)

5
mas

Ich habe das gefunden:

NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);

Um die Subnetzmaske für ipv6 zu erhalten, können wir Folgendes verwenden:

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

Um die Subnetzmaske für ipv4 zu erhalten, können wir Folgendes verwenden:

networkInterface.getInterfaceAddresses().get(1).getNetworkPrefixLength();
4
Mr.Dohai

Ich habe eine reine IPv4-Lösung entwickelt, die einfach genug ist. Das brauchte ich, um hier Netzmasken für Subnetze zu generieren, um diese Subnetze korrekt zu delegieren. Ich weiß, ich hätte eine Tabelle der 32 möglichen Masken erstellen können, aber ich habe es vorgezogen, es jedes Mal berechnet zu haben.

Also hier ist meine Lösung.

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

Rufen Sie es einfach mit der IP-Adresse und dem Präfix an, das Sie verwenden möchten, es generiert die Netzmaske für Sie.

3
FofBorg

Zusammenfassend würde eine Methode zum Erhalten der Maske folgendermaßen aussehen:

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

Hier finden Sie eine Antwort, wie Sie eine Submaske von einer WIFI-Verbindung erhalten: link

Ich habe es an meine Bedürfnisse angepasst und hier ist es:

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

Ich habe gerade mit der Arbeit an einer API für das Subnetting von Netzwerken mit Java fertiggestellt.

https://launchpad.net/subnettingapi

es hat diese Funktionalität und mehr.

2
tak

FWIW, ich hatte früher versucht, InterfaceAddress.getNetworkPrefixLength () und InterfaceAddress.getBroadcast () zu verwenden, aber sie geben keine genauen Informationen zurück (dies ist unter Windows mit Sun JDK 1.6.0 Update 10). Die Länge des Netzwerkpräfixes ist 128 (nicht 24 in meinem Netzwerk), und die zurückgegebene Broadcast-Adresse ist 255.255.255.255 (nicht 192.168.1.255, die sich in meinem Netzwerk befindet).

James

Update: Ich habe gerade die Lösung hier gefunden:

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

Sie müssen verhindern, dass Java IPv6 verwendet, damit es nicht über IPv6 zu IPv4 gelangt. Durch Hinzufügen von -Djava.net.preferIPv4Stack = true zur Befehlszeile werden die Ergebnisse von InterfaceAddress.getNetworkPrefixLength () und InterfaceAddress korrigiert .getBroadcast () für mich.

1
James Synge

Sie können den erhaltenen Wert folgendermaßen in das Standardtextformat konvertieren:

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

Dies funktionierte für mich. [.___.] Hier hat das variable Subnetz die Subnetzadresse.

0
Preetam Kumar