Вычислить диапазон IP по маске подсети

Если у меня есть маска подсети, например 255.255.255.0 и IP-адрес 192.168.1.5 , есть ли простой способ определить все возможные IP-адреса в этой подсети?

В этом случае:

 192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4 ... ... 192.168.1.252 192.168.1.253 192.168.1.254 192.168.1.255 

Все, что я нашел до сих пор, это тяжелые перегруженные библиотеки .net. Не существует ли какой-либо родной способ решить эту проблему с помощью пространств имен по умолчанию?

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

    1) Возьмите маску подсети (здесь 255.255.255.0) и преобразуйте ее в двоичную:

     11111111.11111111.11111111.00000000 ( 8 + 8 + 8 + 0 = 24 -> So you can write your ip adresse like this : 192.168.1.x/24 because you are in a /24 network) 

    2) У вас в сети 24/2 256-2 = 254 доступных ip-адреса для хоста (один для сетевого адреса (первый в вашем диапазоне), а другой – для широковещательного адреса (последний в вашем диапазоне)) ,

    3) Чтобы получить свой диапазон, просто получите свой сетевой адрес (первый адрес ip в соответствии с вашей маской подсети) и получите следующие 255 IP-адресов, и у вас будет свой диапазон.

    Ваш сетевой адрес:

    В двоичном коде последний октет должен иметь значение null:

     xxxxxxxx.xxxxxxxx.xxxxxxxx.00000000 

    Адрес для трансляции:

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

     xxxxxxxx.xxxxxxxx.xxxxxxxx.11111111 

    Здесь ваш IP-адрес – 192.168.1.5. В двоичном коде мы получаем:

     11000000.10101000.00000000.00000101 
    1. Ваш адрес в сети: 11000000.10101000.00000000.00000000 < -> 192.168.1.0
    2. Ваш широковещательный адрес: 11000000.10101000.000000000.11111111 < -> 192.168.1.255
    3. Первый полезный IP-адрес: 192.168.1.1

    4. Последний использованный IP-адрес: 192.168.1.254

    Надеюсь, вам понравилось читать плохой английский. Скажи мне, если у тебя есть вопрос, Лорис

    10 минут кодирования и НЕ полностью протестированы:

     class IPSegment { private UInt32 _ip; private UInt32 _mask; public IPSegment(string ip, string mask) { _ip = ip.ParseIp(); _mask = mask.ParseIp(); } public UInt32 NumberOfHosts { get { return ~_mask+1; } } public UInt32 NetworkAddress { get { return _ip & _mask; } } public UInt32 BroadcastAddress { get { return NetworkAddress + ~_mask; } } public IEnumerable Hosts(){ for (var host = NetworkAddress+1; host < BroadcastAddress; host++) { yield return host; } } } public static class IpHelpers { public static string ToIpString(this UInt32 value) { var bitmask = 0xff000000; var parts = new string[4]; for (var i = 0; i < 4; i++) { var masked = (value & bitmask) >> ((3-i)*8); bitmask >>= 8; parts[i] = masked.ToString(CultureInfo.InvariantCulture); } return String.Join(".", parts); } public static UInt32 ParseIp(this string ipAddress) { var splitted = ipAddress.Split('.'); UInt32 ip = 0; for (var i = 0; i < 4; i++) { ip = (ip << 8) + UInt32.Parse(splitted[i]); } return ip; } } 

    Использование:

      static void Main(string[] args) { IPSegment ip = new IPSegment("192.168.1.1","255.255.255.248"); Console.WriteLine(ip.NumberOfHosts); Console.WriteLine(ip.NetworkAddress.ToIpString()); Console.WriteLine(ip.BroadcastAddress.ToIpString()); Console.WriteLine("==="); foreach (var host in ip.Hosts()) { Console.WriteLine(host.ToIpString()); } Console.ReadLine(); } 

    yup, конвертировать все в 32-битное представление (при условии, что IPv4). если ваша маска равна M, а IP – IP, тогда ваш IP-диапазон (M & IP) +1, (M & IP) +2, …, (M & IP) + (~ M) -1. где & побитовое И и ~ побитовое.

    для преобразования вещей в 32-битное представление, каждое пятно в ip abcd является 8-битным числом.

    Хороший звонок. Не используйте для этого дополнительные библиотеки. Это довольно просто. Вот как я это делаю:

     public static uint[] GetIpRange(string ip, IPAddress subnet) { uint ip2 = Utils.IPv4ToUInt(ip); uint sub = Utils.IPv4ToUInt(subnet); uint first = ip2 & sub; uint last = first | (0xffffffff & ~sub); return new uint[] { first, last }; } 

    Замечания:
    Вам нужно будет сделать еще несколько работ по преобразованию IP-адресов в uint и обратно (должно быть достаточно просто). Затем вы можете перебирать все IP-адреса с помощью простого цикла for между первым и последним .

    Что-то вроде этого (не проверено):

     byte[] bytes = subnet.GetAddressBytes(); uint sub = (uint)((bytes[0] < < 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]); IPAddress ip1 = IPAddress.Parse(ip); bytes = ip1.GetAddressBytes(); uint ip2 = (uint)((bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]);