Как рассчитать диапазон IP-адресов, когда заданы IP-адрес и сетевая маска?

Когда IP-диапазон записывается как aaa.bbb.ccc.ddd / netmask ( обозначение CIDR ), мне нужно вычислить первый и последний включенный ip-адрес в этом диапазоне с помощью C #.

Пример:

Вход: 192.168.0.1/25

Результат: 192.168.0.1 – 192.168.0.126

у моего хорошего друга Алессандро хорошая запись о битовых операторах на C #, вы должны прочитать об этом, чтобы вы знали, что делать.

Это довольно легко . Если вы разбиваете IP-адрес, предоставленный вам двоичным, сетевой адрес – это IP-адрес, где все хост-биты (0 в маске подсети) равны 0, а последний адрес – широковещательный адрес – где все хосты бит – 1.

Например:

ip 192.168.33.72 mask 255.255.255.192 11111111.11111111.11111111.11000000 (subnet mask) 11000000.10101000.00100001.01001000 (ip address) 

Полужирным элементом являются бит HOST (остальные – сетевые биты). Если вы перевернете все биты хоста на 0 на IP, вы получите первый возможный IP:

 11000000.10101000.00100001.01000000 (192.168.33.64) 

Если вы перевернете все биты хоста в 1, вы получите последний возможный IP-адрес (например, широковещательный адрес):

 11000000.10101000.00100001.01111111 (192.168.33.127) 

Итак, для моего примера:

 the network is "192.168.33.64/26": Network address: 192.168.33.64 First usable: 192.168.33.65 (you can use the network address, but generally this is considered bad practice) Last useable: 192.168.33.126 Broadcast address: 192.168.33.127 

Я просто отправлю код:

 IPAddress ip = new IPAddress(new byte[] { 192, 168, 0, 1 }); int bits = 25; uint mask = ~(uint.MaxValue >> bits); // Convert the IP address to bytes. byte[] ipBytes = ip.GetAddressBytes(); // BitConverter gives bytes in opposite order to GetAddressBytes(). byte[] maskBytes = BitConverter.GetBytes(mask).Reverse().ToArray(); byte[] startIPBytes = new byte[ipBytes.Length]; byte[] endIPBytes = new byte[ipBytes.Length]; // Calculate the bytes of the start and end IP addresses. for (int i = 0; i < ipBytes.Length; i++) { startIPBytes[i] = (byte)(ipBytes[i] & maskBytes[i]); endIPBytes[i] = (byte)(ipBytes[i] | ~maskBytes[i]); } // Convert the bytes to IP addresses. IPAddress startIP = new IPAddress(startIPBytes); IPAddress endIP = new IPAddress(endIPBytes); 

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

Например, сеть 192.115.103.64 / 27, каков диапазон?

просто помните, что маска подсети равна 0, 128, 192, 224, 240, 248, 252, 254, 255

255.255.255.255 11111111.11111111.11111111.11111111 / 32

255.255.255.254 11111111.11111111.11111111.11111110 / 31

255.255.255.252 11111111.11111111.11111111.11111100 / 30

255.255.255.248 11111111.11111111.11111111.11111000 / 29

255.255.255.240 11111111.11111111.11111111.11110000 / 28

255.255.255.224 11111111.11111111.11111111.11100000 / 27

255.255.255.192 11111111.11111111.11111111.11000000 / 26

255.255.255.128 11111111.11111111.11111111.10000000 / 25

255.255.255.0 11111111.11111111.11111111.00000000 / 24

из / 27 мы знаем, что (11111111.11111111.11111111.11100000). Подсчет слева, это третий номер из последнего октета, который равен маске подсети 255.255.255.224. (Не считайте 0, 0 есть / 24), так что 128, 192, 224 ..etc

Здесь, где идет математика:

используйте маску подсети – маску подсети предыдущей маски подсети в этом случае 224-192 = 32

Мы знаем, что 192.115.103.64 – это сеть: 64 + 32 = 96 (следующая сеть для / 27)

что означает, что у нас есть .0 .32. 64. 96. 128. 160. 192. 224. (Нельзя использовать 256, потому что это .255)

Вот диапазон 64 – 96.

сеть – 64.

первый хост – 65. (первая сеть +1)

Последний хост – 94. (трансляция -1)

трансляция – 95. (последняя сеть -1)

Инвертировать маску (XOR с одним), И с IP. Добавить 1. Это будет начальный диапазон. ИЛИ IP с маской. Это будет конечный диапазон.

Я бы рекомендовал использовать библиотеку IPNetwork https://github.com/lduchosal/ipnetwork . Начиная с версии 2, он поддерживает IPv4 и IPv6.

IPv4

  IPNetwork ipnetwork = IPNetwork.Parse("192.168.0.1/25"); Console.WriteLine("Network : {0}", ipnetwork.Network); Console.WriteLine("Netmask : {0}", ipnetwork.Netmask); Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast); Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable); Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable); Console.WriteLine("Usable : {0}", ipnetwork.Usable); Console.WriteLine("Cidr : {0}", ipnetwork.Cidr); 

Вывод

  Network : 192.168.0.0 Netmask : 255.255.255.128 Broadcast : 192.168.0.127 FirstUsable : 192.168.0.1 LastUsable : 192.168.0.126 Usable : 126 Cidr : 25 

Повеселись !

Я знаю, что это старый вопрос, но я нашел эту отличную библиотеку на nuget, которая, кажется, делает для меня всего лишь трюк:

http://nuget.org/packages/TakeIo.NetworkAddress/

Возможно, вы уже это знаете, но чтобы убедиться, что вы правильно это поняли, смотрите http://www.subnet-calculator.com/ – вы можете видеть, как биты представляют собой сетевую и хост-часть адреса ,

Вход: 192.168.0.1/25

Маска – это часть: /25

Чтобы найти сетевой адрес, выполните следующие действия:

  • Вычтите маску из длины ip (32 – маска) = 32 – 25 = 7 и возьмите эти биты справа

  • В данном ip-адресе Ie: 192.168.0.1 в двоичном формате: 11111111 11111111 00000000 00000001 Теперь, взяв 7 бит из права ‘0’ 1111111 11111111 00000000 00000000 Что в десятичной 1111111 11111111 00000000 00000000 : 192.168.0.0 (это сетевой адрес)

Чтобы найти первый действительный / полезный IP-адрес, добавьте +1 к сетевому адресу. Ie: 192.168.0.1

Чтобы найти последний / широковещательный адрес, процедура такая же, как и для поиска сетевого адреса, но здесь вы должны сделать биты (32 маски) справа на «1»,

Т.е.: 11111111 11111111 00000000 01111111 Что в десятичной 192.168.0.127192.168.0.127

Чтобы найти последний действительный / полезный ip-адрес, вычитайте 1 из широковещательного адреса Ie: 192.168.0.126

Interesting Posts

Excel – сопоставление значений в столбцах на разных вкладках, а затем вставка в другой столбец, если есть совпадение

Диаграмма Венна пропорциональная и цветовая штриховка с полупрозрачностью

Есть ли ярлык для дублирования вкладки в Google Chrome?

Почему мое векторное масштабируемое масштабирование не ожидается?

Чтение заголовков ответов при использовании $ http Angularjs

Как передать переменную от Activity to Fragment и передать ее обратно?

Mockito: ввод реальных объектов в закрытые поля @Autowired

Избегание UAC, но запуск повышенного процесса с помощью службы Windows

Когда инициализируются статические и глобальные переменные?

Прочитать текстовый файл с фиксированной шириной

Запись большого набора результатов в файл Excel с использованием POI

Как добавить привязку к событию инициализации контекста приложения?

Как изменить цвет фона ActionBar ActionBarActivity с помощью XML?

Как создать динамический метод расширения соединения LINQ

jquery проверить, если он нажат или нет

Давайте будем гением компьютера.