计算子网内的所有地址...用于IPv6

Dav*_*eUK 7 c# ipv6 subnet

我见过很多伟大的C#示例其中演示了如何在CIDR标记提供的IPv4地址转换(如192.168.0.1/25)到他们的相关范围(192.168.0.1 - 192.168.0.126).我的程序需要能够这样做(计算我本地子网中的所有地址),但我也想支持IPv6.

如果我的C#程序有我所有的典型IPCONFIG信息(IPv4地址,子网掩码,IPv6地址,链路本地V6地址,默认网关) - 我怎么会去生成所有IPv6的列表在我的本地子网地址,将它们输出到控制台?

Emi*_*elt 9

您可以使用eExNetworkLibrary.IP.IPAddressAnalysis类从eExNetworkLibrary.

以下代码适用于IPv4和IPv6(刚刚测试过).

        string strIn = "2001:DB8::/120";

        //Split the string in parts for address and prefix
        string strAddress = strIn.Substring(0, strIn.IndexOf('/'));
        string strPrefix = strIn.Substring(strIn.IndexOf('/') + 1);

        int iPrefix = Int32.Parse(strPrefix);
        IPAddress ipAddress = IPAddress.Parse(strAddress);

        //Convert the prefix length to a valid SubnetMask

        int iMaskLength = 32;

        if(ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
        {
            iMaskLength = 128;
        }

        BitArray btArray = new BitArray(iMaskLength);
        for (int iC1 = 0; iC1 < iMaskLength; iC1++)
        {
            //Index calculation is a bit strange, since you have to make your mind about byte order.
            int iIndex = (int)((iMaskLength - iC1 - 1) / 8) * 8 + (iC1 % 8);

            if (iC1 < (iMaskLength - iPrefix))
            {
                btArray.Set(iIndex, false);
            }
            else
            {
                btArray.Set(iIndex, true);
            }
        }

        byte[] bMaskData = new byte[iMaskLength / 8];

        btArray.CopyTo(bMaskData, 0);

        //Create subnetmask
        Subnetmask smMask = new Subnetmask(bMaskData);

        //Get the IP range
        IPAddress ipaStart = IPAddressAnalysis.GetClasslessNetworkAddress(ipAddress, smMask);
        IPAddress ipaEnd = IPAddressAnalysis.GetClasslessBroadcastAddress(ipAddress, smMask);

        //Omit the following lines if your network range is large
        IPAddress[] ipaRange = IPAddressAnalysis.GetIPRange(ipaStart, ipaEnd);

        //Debug output
        foreach (IPAddress ipa in ipaRange)
        {
            Console.WriteLine(ipa.ToString());
        }

        Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

我不完全确定我是否完成了从前缀长度到包含子网掩码权限的字节数组的转换,但是这段代码应该给你一个很好的起点.

编辑:更新了代码的位弯曲部分.可能很丑,但适用于这个例子.如果您需要,我认为您将能够找到更好的解决方案.那些BitArrays是痛苦的.

请注意,如果网络很大,生成IPv6网络范围可能是一项非常耗费内存/ CPU的任务.