Reputation: 2555
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
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
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