user1632018
user1632018

Reputation: 2555

Split a larger range of ip's into specified amount of smaller ranges or groups

I am trying to figure out how I can split a range of Ip addresses into multiple groups.

Let's say I wanted to basically divide the range 10.15.0.100 to 11.05.8.15 into 5 smaller ranges or any number for that matter. How could I do so in C#?

Upvotes: 0

Views: 455

Answers (2)

Fung
Fung

Reputation: 3558

You can convert the IPs into numbers, then treat the problem like splitting a list of numbers into ranges.

public class IPRange
{
    public IPAddress Start { get; set; }
    public IPAddress End { get; set; }
    public int Count { get; set; }

    public static IEnumerable<IPRange> Split(IPAddress ipStart, IPAddress ipEnd, int rangeCount)
    {
        // Assuming running on little-endian machine.
        // Thus Reverse() is necessary to convert between network order and little-endian.
        var start = BitConverter.ToInt32(ipStart.GetAddressBytes().Reverse().ToArray(), 0);
        var end = BitConverter.ToInt32(ipEnd.GetAddressBytes().Reverse().ToArray(), 0);

        var rangeSize = (end - start + 1) / rangeCount;
        var remains = (end - start + 1) % rangeCount;

        while (start < end)
        {
            var rangeEnd = Math.Min(start + rangeSize - 1, end);
            if (remains > 0)
            {
                // Take one from the remains to keep size of each range more balance
                rangeEnd++;
                remains--;
            }

            yield return new IPRange
            {
                Start = new IPAddress(BitConverter.GetBytes(start).Reverse().ToArray()),
                End = new IPAddress(BitConverter.GetBytes(rangeEnd).Reverse().ToArray()),
                Count = rangeEnd - start + 1
            };
            start = rangeEnd + 1;
        }
    }
}

Usage:

var ranges = IPRange.Split(IPAddress.Parse("10.15.0.100"), IPAddress.Parse("11.5.8.15"), 5);
foreach (var range in ranges)
    Console.WriteLine(string.Format("{0} - {1} [{2}]", range.Start, range.End, range.Count));

Output:

10.15.0.100 - 10.64.53.31 [3224764]
10.64.53.32 - 10.113.105.219 [3224764]
10.113.105.220 - 10.162.158.151 [3224764]
10.162.158.152 - 10.211.211.83 [3224764]
10.211.211.84 - 11.5.8.15 [3224764]

Upvotes: 2

fuzzybear
fuzzybear

Reputation: 2405

you can do IP address calculations using system.Net.IPAddress class see this link for examples. http://blogs.msdn.com/b/knom/archive/2008/12/31/ip-address-calculations-with-c-subnetmasks-networks.aspx

Upvotes: 0

Related Questions