Подтвердить что ты не робот

Как получить маску подсети локальной системы с помощью java?

Как вы получаете адрес маски Subnet локальной системы, использующей Java?

4b9b3361

Ответ 1

сетевая маска первого адреса интерфейса localhost:

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

более полный подход:

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

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

/24 означает 255.255.255.

Ответ 2

java.net.InterfaceAddress в SE6 имеет метод getNetworkPrefixLength, который возвращает, как следует из названия, длину префикса сети. Вы можете рассчитать маску подсети, если вы предпочитаете ее в этом формате. java.net.InterfaceAddress поддерживает как IPv4, так и IPv6.

getSubnetMask() в нескольких API сетевых приложений возвращает маску подсети в форме java.net.InetAddress для указанного IP-адреса (локальная система может иметь много локальных IP-адресов)

Ответ 3

Я обнаружил, что:

NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);

Чтобы получить маску подсети для ipv6, мы можем использовать:

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

Чтобы получить маску подсети для ipv4, мы можем использовать:

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

Ответ 4

Я разработал только IPv4-решение, достаточно простое. Мне понадобилось, чтобы генерировать сетевую маску для подсети здесь, чтобы правильно делегировать эти подсети. Я знаю, что мог бы создать таблицу из 32 возможных масок, но я предпочел бы ее вычислять каждый раз.

Итак, вот мое решение.

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

Вы просто вызываете его с IP-адресом и префиксом, который хотите использовать, он будет генерировать сетевую маску для вас.

Ответ 5

Я только что закончил работу над API для сетей подсети с Java.

https://launchpad.net/subnettingapi

у него есть эта функциональность и многое другое.

Ответ 6

Вот ответ, как получить подмаск из WIFI-соединения: ссылка

Я адаптировал его для своих нужд, и вот он:

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

Ответ 7

Таким образом, метод для получения маски будет выглядеть следующим образом:

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

Ответ 8

FWIW, в прошлом я пытался использовать InterfaceAddress.getNetworkPrefixLength() и InterfaceAddress.getBroadcast(), но они не возвращают точную информацию (это в Windows с обновлением Sun JDK 1.6.0 10). Длина префикса сети составляет 128 (не 24, что находится в моей сети), а широковещательный адрес - 255.255.255.255 (не 192.168.1.255, который находится в моей сети).

Джеймс

Обновление: я нашел решение, размещенное здесь:

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

Вам нужно запретить Java использовать IPv6, чтобы он не попадал на IPv4 через IPv6. Добавление -Djava.net.preferIPv4Stack = true в командной строке фиксирует результаты из интерфейсаAdapterAddress.getNetworkPrefixLength() и InterfaceAddress.getBroadcast() для меня.

Ответ 9

Вы можете преобразовать полученное значение в стандартный текстовый формат следующим образом:

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;

Ответ 10

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

Это сработало для меня. здесь переменная подсеть имеет адрес подсети.