Как получить максимальное количество хостов с IP-адреса - PullRequest
0 голосов
/ 08 сентября 2018

Мой вопрос: как получить максимальное количество хостов, которые можно использовать в сети, к которой относится указанный IP-адрес.

У меня есть такой java-метод, который имеет два аргумента ip-адрес и адрес маски подсети. Когда я Google, я нашел формулу, но я не знаю, как писать с Java. Формула

Максимальное количество хостов можно определить по количеству хостов. доступно в сети, это число, полученное путем вычитания двух меньше и широковещательный адрес.

public static int maxHostNum(String _ip, String _subnetMask) throws UnknownHostException {
    byte[] bIP = InetAddress.getByName(_ip).getAddress();
    byte[] bSB = InetAddress.getByName(_subnetMask).getAddress();
    byte[] bNT = new byte[4];
    for (int i=0; i<bIP.length; i++) {
        bNT[i] = (byte) (~bSB[i] | bIP[i]);
    }
    String broadcastAddress = InetAddress.getByAddress(bNT).toString();

    // i dont know the rest

    return maxHostNum;
}

Я знаю, что общая библиотека Apache может это сделать, но я просто хочу обойтись без использования библиотеки

1 Ответ

0 голосов
/ 08 сентября 2018

Маска подсети определяет, какая часть IP-адреса является сетевым IP-адресом, а какая - IP-адресом устройства, выполняя побитовое И между маской и IP-адресом, чтобы получить сетевой IP-адрес. Например:

192.168.3.45 ->    11000000.10101000.00000011.00101101
255.255.255.240 -> 11111111.11111111.11111111.11110000
Network IP ->      11000000.10101000.00000011.00100000 <- because the last 4 digits of the subnet mask were 0 here, the resulting network IP bits are also 0.
Host IP ->         00000000.00000000.00000000.00001101

Так как в приведенном выше примере последние 4 цифры определяют IP-адрес хоста, у вас должно быть 2 ^ 4 доступных IP-адреса, но на самом деле у вас есть 2 ^ 4 - 2, потому что адреса, где все биты хоста равны 1 или 0 являются особыми и не могут использоваться для определенных устройств.

Чтобы узнать, сколько IP-адресов хостов может поддерживать сеть, вы можете просто инвертировать значения маски подсети и превратить ее в int:

int result = 0;
for (int i = 0; i < bSB.length; i++) {
    result <<= 8; // Bit shift 8 digits to the left.
    result |= ~bSB[i]; // Perform bitwise or-equals with the bitwise inverted value of bSB[i]
}
result <<= 8;
result -= 2; // Special IPs

Полученное целое число - количество возможных IP-адресов хоста.

...