Как использовать IPAddress и IPv4Mask для получения диапазона IP-адресов? - PullRequest
3 голосов
/ 15 июня 2009

Я пытаюсь сделать следующее в C # /. NET 2.0:

Учитывая объект IPAddress (скажем, 192.168.127.100) и другой объект IPAddress, содержащий маску IPv4Mask / subnet (скажем, 255.255.248.0), я должен иметь возможность вычислять начало и конец диапазона IP-адресов.

(Да, я пытаюсь выполнить цикл for через диапазон адресов в подсети.)

Теоретически, я должен иметь возможность побитового И на IP-адресе и SubnetMask, чтобы получить IPStart. Тогда я смогу выполнить побитовое XOR для IPStart и перевернутой (NOT'd) SubnetMask, чтобы получить IPEnd.

Объект IPAddress предоставляет методы для вывода адреса как «long» или как «byte []» (массив байтов).

Выполнение побитовой операции над long (потому что она подписана?) Приводит к неверным результатам. И я не могу выполнить битовую операцию над IP-адресами в виде массива байтов.

РЕДАКТИРОВАТЬ-1: Хорошо, цикл по каждому байту в массиве и выполнение побитовых операций И, НЕ и XOR (в каждой соответствующей ситуации) дает правильные результаты.

Следующая проблема, с которой я сталкиваюсь, заключается в том, что я не могу легко выполнить цикл for после преобразования массивов byte [] в UInt32 или long. Итак, первое значение работает правильно, но увеличение значения uint / long на единицу увеличивает IP-адрес с 192.168.127.0 до 193.168.127.0 - кажется, что после преобразования массива byte [] в uint / long порядок байты меняются местами. Так что нет простого способа перейти от IPStart к IPEnd.

У кого-нибудь есть предложения?

Ответы [ 4 ]

3 голосов
/ 15 июня 2009

Просмотрите два байтовых массива вместе, для каждой пары битов проведите побитовое сравнение и поместите результат в третий массив байтов [] для начала диапазона. Можно выполнить обход массива byte [] сетевого адреса и инвертировать каждый бит, чтобы сгенерировать маску подстановки (как вы называли ее, инвертированную маску подсети), а затем повторить процесс, как и раньше, используя маску подстановки вместо маски подсети для вычисления конец диапазона Помните также, что первое значение в диапазоне - это сетевой адрес подсети, а последнее - широковещательный адрес, поэтому эти два адреса не находятся в фактическом диапазоне адресов хоста. Вот ваш пример в пошаговой сводке:

Address:   192.168.127.100       11000000.10101000.01111 111.01100100
Netmask:   255.255.248.0 = 21    11111111.11111111.11111 000.00000000
Wildcard:  0.0.7.255             00000000.00000000.00000 111.11111111
=>
Network:   192.168.120.0/21      11000000.10101000.01111 000.00000000
Broadcast: 192.168.127.255       11000000.10101000.01111 111.11111111
HostMin:   192.168.120.1         11000000.10101000.01111 000.00000001
HostMax:   192.168.127.254       11000000.10101000.01111 111.11111110
2 голосов
/ 15 июня 2009

Вы можете использовать BitConverter , чтобы превратить эти массивы в uints.

Попробуйте это:

uint address = BitConverter.ToUInt32(IPAddress.Parse("192.168.127.100").GetAddressBytes(), 0);
uint mask = BitConverter.ToUInt32(IPAddress.Parse("255.255.248.0").GetAddressBytes(), 0);
1 голос
/ 16 марта 2011

http://ipnetwork.codeplex.com/

Пример кода:

var network = IPNetwork.Parse("192.168.1.0/29");
var addresses = IPNetwork.ListIPAddress(network);

foreach (var ip in addresses) {
    Console.WriteLine("{0}", ip);
}
1 голос
/ 15 июня 2009

Вы на правильном пути. Просто обрабатывайте каждый байт в массиве отдельно.

...