2009-08-03 9 views

Odpowiedz

4

java.net.InterfaceAddress w SE6 ma metodę getNetworkPrefixLength, która zwraca, jak sama nazwa wskazuje, długość prefiksu sieci. Możesz obliczyć maskę podsieci z tego, jeśli wolisz ją mieć w tym formacie. java.net.InterfaceAddress obsługuje zarówno IPv4, jak i IPv6.

getSubnetMask() w kilku aplikacji sieciowych API zwraca maskę podsieci w postaci java.net.InetAddress dla określonego adresu IP (system lokalny może mieć wiele lokalnych adresów IP)

22

maskę sieci pierwszego adres localhost interfejs:

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

pełniejsze podejście:

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

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

/24 oznacza 255.255.255.

+0

dlaczego ta metoda nie wyświetla informacje prywatne IP na Androida. działa na komputerze, ale nie na Androidzie. daje mi prywatne informacje na temat ipv6 i localhost. Ale nie ipv4 04-04 14: 16: 02.269 1570-1630/com.example.android.droidscanner V/INET:/:: 1% 1% 1/128 [null] 04-04 14: 16: 02.269 1570- 1630/com.example.android.droidscanner V/INET: /127.0.0.1/8 [null] – miatech

1

FWIW, w przeszłości próbowałem używać InterfaceAddress.getNetworkPrefixLength() i InterfaceAddress.getBroadcast(), ale nie zwracają dokładnych informacji (jest to w systemie Windows, z Sun JDK 1.6.0 aktualizacja 10). Długość prefiksu sieci wynosi 128 (nie 24, która jest w mojej sieci), a zwracany adres transmisji to 255.255.255.255 (nie 192.168.1.255, który znajduje się w mojej sieci).

James

Update: Właśnie znalazłem rozwiązanie zamieszczone tutaj:

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

Trzeba zapobiec Java z użyciem protokołu IPv6, tak że nie jest dotarcie do IPv4 przez IPv6. Dodawanie -Djava.net.preferIPv4Stack = true do wiersza poleceń naprawia dla mnie wyniki z InterfaceAddress.getNetworkPrefixLength() i InterfaceAddress.getBroadcast().

+0

Niestety nie dla mnie .... To da niespójne wyniki. – gd1

+0

link nie działa – Andy

3

Opracowałem proste rozwiązanie IPv4. Potrzebowałem tego do wygenerowania maski sieci dla podsieci tutaj, aby poprawnie delegować te podsieci. Wiem, że mogłem wygenerować tabelę z 32 możliwymi maskami, ale wolałem ją obliczać za każdym razem.

Oto moje rozwiązanie.

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

po prostu nazwać to z IP i prefiks chcesz użyć, będzie generować maskę dla Ciebie.

3

znalazłem, że:

NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost); 

Aby uzyskać SubnetMask IPv6 możemy użyć:

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

Aby uzyskać SubnetMask dla IPv4 możemy użyć:

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

Oto odpowiedź, jak uzyskać submask z połączenia WIFI: link

ja go dostosowany do moich potrzeb, i to jest tutaj:

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

Jest to specyficzne dla Androida, którego pytanie nie zostało określone. – WouterH

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

Ten pracował dla mnie. Tutaj podsieć o zmiennej ma adres podsieci.

-2

Można konwertować uzyskaną wartość w standardowym formacie tekstowym jak poniżej:

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; 
Powiązane problemy