2009-08-03 3 views

Antwort

4

java.net.InterfaceAddress in SE6 hat eine getNetworkPrefixLength-Methode, die, wie der Name schon sagt, die Netzwerkpräfixlänge zurückgibt. Sie können die Subnetzmaske daraus berechnen, wenn Sie es lieber in diesem Format haben möchten. java.net.InterfaceAddress unterstützt sowohl IPv4 als auch IPv6.

getSubnetMask() in mehrere Netzwerkanwendung gibt APIs Subnetzmaske in java.net.InetAddress Form zur angegebenen IP-Adresse (eine lokale System kann viele lokalen IP-Adressen hat)

22

die Netmask der ersten Adresse des lokalen Host Schnittstelle:

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

eine vollständigere 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.

+0

, warum diese Methode auf Android private IP-Informationen nicht angezeigt. Es funktioniert auf einem Computer, aber nicht auf Android. es gibt mir private Informationen auf ipv6 und localhost. Aber nicht ipv4 04-04 14: 16: 02.269 1570-1630/com.beispiel.android.droidscanner V/INET:/:: 1% 1% 1/128 [null] 04-04 14: 16: 02.269 1570- 1630/com.beispiel.android.droidscanner V/INET: /127.0.0.1/8 [null] – miatech

1

FWIW, in der Vergangenheit habe ich versucht mit InterfaceAddress.getNetworkPrefixLength() und InterfaceAddress.getBroadcast(), aber sie geben keine genauen Informationen (das ist unter Windows, mit Sun JDK 1.6.0 Update 10). Die Netzwerkpräfixlänge ist 128 (nicht 24, die es in meinem Netzwerk ist), und die Broadcastadresse, die zurückgegeben wird, ist 255.255.255.255 (nicht 192.168.1.255, das es in meinem Netzwerk ist).

James

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

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

Sie benötigen Java, um zu verhindern IPv6 verwenden, so dass es nicht zu IPv4 über IPv6 zu bekommen. Das Hinzufügen von -Djava.net.preferIPv4Stack = true zur Befehlszeile korrigiert die Ergebnisse von InterfaceAddress.getNetworkPrefixLength() und InterfaceAddress.getBroadcast() für mich.

+0

Leider nicht für mich .... Es wird inkonsistente Ergebnisse geben. – gd1

+0

Link funktioniert nicht – Andy

3

Ich entwickelte eine IPv4-Lösung, die einfach genug ist. Ich brauchte das, um hier eine Netzmaske für Subnetze zu erzeugen, um diese Subnetze korrekt zu delegieren. Ich weiß, ich hätte eine Tabelle der 32 möglichen Masken erstellen können, aber ich zog es vor, sie jedes Mal zu berechnen.

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

Sie nennen es nur mit dem IP und das Präfix, das Sie verwenden möchten, wird es die Netzmaske für Sie generieren.

3

fand ich, dass:

NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost); 

Um subnetmask für ipv6 bekommen wir verwenden können:

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

Um subnetmask für IPv4- bekommen wir verwenden können:

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

Hier ist ein Antwort, wie man eine Untermaske von der WIFI Verbindung erhält: link

Ich passte es für meine Bedürfnisse, 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; 
} 
+4

Dies ist Android spezifisch, die die Frage nicht angegeben. – WouterH

0
String local=InetAddress.getLocalHost().getHostAddress(); 
String[] ip_component = local.split("\\."); 
String subnet=ip_component[0]+"."+ip_component[1]+"."+ip_component[2]+"."; 

Das ist für mich gearbeitet. Hier hat das variable Subnetz die Subnetzadresse.

-2

Sie können den erhaltenen Wert in den Standard-Textformat wie folgt 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; 
Verwandte Themen