将较大的ip范围拆分为指定数量的较小范围或组

本文关键字:范围 ip 拆分 | 更新日期: 2023-09-27 17:51:19

我正试图找出如何将一系列Ip地址分成多个组。

假设我想将10.15.0.100到11.05.8.15的范围划分为5个更小的范围或任何数字。我如何在c#中做到这一点?

将较大的ip范围拆分为指定数量的较小范围或组

您可以将ip转换为数字,然后将问题视为将数字列表划分为范围。

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;
        }
    }
}

用法:

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));
输出:

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]

您可以使用system.Net.IPAddress类进行IP地址计算,示例见此链接。http://blogs.msdn.com/b/knom/archive/2008/12/31/ip-address-calculations-with-c-subnetmasks-networks.aspx