C# 正在计算IPv6的子网内的所有地址

C# 正在计算IPv6的子网内的所有地址,c#,ipv6,subnet,C#,Ipv6,Subnet,我已经看到了很多很好的例子,它们演示了如何将CIDR表示法(例如192.168.0.1/25)中提供的IPv4地址转换为它们的相关范围(192.168.0.1-192.168.0.126)。我的程序需要能够做到这一点(计算本地子网中的所有地址),但我也想支持IPv6 如果我的C#程序具有所有典型的ipconfig信息(IPv4地址、子网掩码、IPv6地址、链路本地v6地址、默认网关)-如何生成本地子网中所有IPv6地址的列表并将其输出到控制台?您可以从中使用eExNetworkLibrary.I

我已经看到了很多很好的例子,它们演示了如何将CIDR表示法(例如192.168.0.1/25)中提供的IPv4地址转换为它们的相关范围(192.168.0.1-192.168.0.126)。我的程序需要能够做到这一点(计算本地子网中的所有地址),但我也想支持IPv6


如果我的C#程序具有所有典型的ipconfig信息(IPv4地址、子网掩码、IPv6地址、链路本地v6地址、默认网关)-如何生成本地子网中所有IPv6地址的列表并将其输出到控制台?

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

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

strIn=“2001:DB8::/120”;
//将字符串拆分为地址和前缀部分
string strAddress=strIn.Substring(0,strIn.IndexOf('/');
字符串strPrefix=strIn.Substring(strIn.IndexOf('/')+1);
intiprefix=Int32.Parse(strPrefix);
IPAddress IPAddress=IPAddress.Parse(StradAddress);
//将前缀长度转换为有效的子网掩码
int iMaskLength=32;
if(ipAddress.AddressFamily==System.Net.Sockets.AddressFamily.InterNetworkV6)
{
iMaskLength=128;
}
BitArray btArray=新的BitArray(iMaskLength);
for(int-iC1=0;iC1
我不完全确定我是否已经完成了从前缀长度到包含子网掩码的字节数组的转换,但是这段代码应该为您提供一个良好的起点

编辑:更新代码的位弯曲部分。可能很难看,但适用于此示例。我认为如果你需要的话,你将有能力找到更好的解决办法。那些恶作剧真让人讨厌

请注意,如果网络很大,生成IPv6网络范围可能会非常消耗内存/cpu

是一个很好的工具,但是如果您不能在项目中使用它,那么您可能只想看看这篇文章:

它概述了在IPv4中如何计算地址掩码

我知道你的问题与IPv6有关,因为.Net 4.5有一个
IPAddress.maptopv6
方法

您可以利用本文中的检查来生成以下代码:

    private static IPAddress empty = IPAddress.Parse("0.0.0.0");
    private static IPAddress intranetMask1 = IPAddress.Parse("10.255.255.255");
    private static IPAddress intranetMask2 = IPAddress.Parse("172.16.0.0");
    private static IPAddress intranetMask3 = IPAddress.Parse("172.31.255.255");
    private static IPAddress intranetMask4 = IPAddress.Parse("192.168.255.255");

    /// <summary>
    /// Retuns true if the ip address is one of the following
    /// IANA-reserved private IPv4 network ranges (from http://en.wikipedia.org/wiki/IP_address)
    ///  Start        End   
    ///  10.0.0.0       10.255.255.255  
    ///  172.16.0.0       172.31.255.255    
    ///  192.168.0.0   192.168.255.255 
    /// </summary>
    /// <returns></returns>
    public static bool IsOnIntranet(this IPAddress ipAddress)
    {
        if (empty.Equals(ipAddress))
        {
            return false;
        }

        bool onIntranet = IPAddress.IsLoopback(ipAddress);

        if (false == onIntranet)
        {
            //Handle IPv6 by getting the IPv4 Mapped Address. 
            if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                onIntranet = ipAddress.Equals(ipAddress.And(intranetMask1.MapToIPv6())); //10.255.255.255
                onIntranet = onIntranet || ipAddress.Equals(ipAddress.And(intranetMask4.MapToIPv6())); ////192.168.255.255

                onIntranet = onIntranet || (intranetMask2.Equals(ipAddress.And(intranetMask2.MapToIPv6()))
                  && ipAddress.Equals(ipAddress.And(intranetMask3.MapToIPv6())));
            }
            else
            {
                onIntranet = ipAddress.Equals(ipAddress.And(intranetMask1)); //10.255.255.255
                onIntranet = onIntranet || ipAddress.Equals(ipAddress.And(intranetMask4)); ////192.168.255.255

                onIntranet = onIntranet || (intranetMask2.Equals(ipAddress.And(intranetMask2))
                  && ipAddress.Equals(ipAddress.And(intranetMask3)));
            }


        }

        return onIntranet;
    }

private static void CheckIPVersion(IPAddress ipAddress, IPAddress mask, out byte[] addressBytes, out byte[] maskBytes)
    {
        if (mask == null)
        {
            throw new ArgumentException();
        }

        addressBytes = ipAddress.GetAddressBytes();
        maskBytes = mask.GetAddressBytes();

        if (addressBytes.Length != maskBytes.Length)
        {
            throw new ArgumentException("The address and mask don't use the same IP standard");
        }
    }

    public static IPAddress And(this IPAddress ipAddress, IPAddress mask)
    {
        byte[] addressBytes;
        byte[] maskBytes;
        CheckIPVersion(ipAddress, mask, out addressBytes, out maskBytes);

        byte[] resultBytes = new byte[addressBytes.Length];
        for (int i = 0, e = addressBytes.Length; i < e; ++i)
        {
            resultBytes[i] = (byte)(addressBytes[i] & maskBytes[i]);
        }

        return new IPAddress(resultBytes);
    }
private static IPAddress empty=IPAddress.Parse(“0.0.0.0”);
专用静态IPAddress intranetMask1=IPAddress.Parse(“10.255.255.255”);
私有静态IPAddress intranetMask2=IPAddress.Parse(“172.16.0.0”);
私有静态IPAddress intranetMask3=IPAddress.Parse(“172.31.255.255”);
私有静态IPAddress intranetMask4=IPAddress.Parse(“192.168.255.255”);
/// 
///如果ip地址是以下地址之一,则Retuns true
///IANA保留的专用IPv4网络范围(从http://en.wikipedia.org/wiki/IP_address)
///起始端
///  10.0.0.0       10.255.255.255  
///  172.16.0.0       172.31.255.255    
///  192.168.0.0   192.168.255.255 
/// 
/// 
公共静态bool IsOnIntranet(此IPAddress IPAddress)
{
if(空。等于(ipAddress))
{
返回false;
}
bool-onIntranet=IPAddress.IsLoopback(IPAddress);
if(false==onIntranet)
{
//通过获取IPv4映射地址来处理IPv6。
if(ipAddress.AddressFamily==AddressFamily.InterNetworkV6)
{
onIntranet=ipAddress.Equals(ipAddress.And(intranetMask1.maptopv6());//10.255.255.255
onIntranet=onIntranet | | ipAddress.Equals(ipAddress.And(intranetMask4.maptopv6());///192.168.255.255
onIntranet=onIntranet | |(intranetMask2.Equals(ipAddress.And(intranetMask2.maptopv6()))
&&ipAddress.Equals(ipAddress.And(intranetMask3.MapToIPv6());
}
其他的
{
onIntranet=ipAddress.Equals(ipAddress.And(intranetMask1));//10.255.255.255
onIntranet=onIntranet | | ipAddress.Equals(ipAddress.And(intranetMask4));///192.168.255.255
onIntranet=onIntranet | |(intranetMask2.Equals(ipAddress.And(intranetMask2))
&&ipAddress.Equals(ipAddress.And(intranetMask3));
}
}
返回Intranet;
}
专用静态无效检查IPVersion(IPAddress IPAddress,IPAddress掩码,输出字节[]地址字节,输出字节[]掩码字节)
{
如果(掩码==null)
{
抛出新ArgumentException();
}
addressBytes=ipAddress.GetAddressBytes();
maskBytes=mask.GetAddressBytes();
if(addressBytes.Length!=maskBytes.Length)
{
抛出新的ArgumentException(“地址和掩码不使用相同的IP标准”);
    private static IPAddress empty = IPAddress.Parse("0.0.0.0");
    private static IPAddress intranetMask1 = IPAddress.Parse("10.255.255.255");
    private static IPAddress intranetMask2 = IPAddress.Parse("172.16.0.0");
    private static IPAddress intranetMask3 = IPAddress.Parse("172.31.255.255");
    private static IPAddress intranetMask4 = IPAddress.Parse("192.168.255.255");

    /// <summary>
    /// Retuns true if the ip address is one of the following
    /// IANA-reserved private IPv4 network ranges (from http://en.wikipedia.org/wiki/IP_address)
    ///  Start        End   
    ///  10.0.0.0       10.255.255.255  
    ///  172.16.0.0       172.31.255.255    
    ///  192.168.0.0   192.168.255.255 
    /// </summary>
    /// <returns></returns>
    public static bool IsOnIntranet(this IPAddress ipAddress)
    {
        if (empty.Equals(ipAddress))
        {
            return false;
        }

        bool onIntranet = IPAddress.IsLoopback(ipAddress);

        if (false == onIntranet)
        {
            //Handle IPv6 by getting the IPv4 Mapped Address. 
            if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                onIntranet = ipAddress.Equals(ipAddress.And(intranetMask1.MapToIPv6())); //10.255.255.255
                onIntranet = onIntranet || ipAddress.Equals(ipAddress.And(intranetMask4.MapToIPv6())); ////192.168.255.255

                onIntranet = onIntranet || (intranetMask2.Equals(ipAddress.And(intranetMask2.MapToIPv6()))
                  && ipAddress.Equals(ipAddress.And(intranetMask3.MapToIPv6())));
            }
            else
            {
                onIntranet = ipAddress.Equals(ipAddress.And(intranetMask1)); //10.255.255.255
                onIntranet = onIntranet || ipAddress.Equals(ipAddress.And(intranetMask4)); ////192.168.255.255

                onIntranet = onIntranet || (intranetMask2.Equals(ipAddress.And(intranetMask2))
                  && ipAddress.Equals(ipAddress.And(intranetMask3)));
            }


        }

        return onIntranet;
    }

private static void CheckIPVersion(IPAddress ipAddress, IPAddress mask, out byte[] addressBytes, out byte[] maskBytes)
    {
        if (mask == null)
        {
            throw new ArgumentException();
        }

        addressBytes = ipAddress.GetAddressBytes();
        maskBytes = mask.GetAddressBytes();

        if (addressBytes.Length != maskBytes.Length)
        {
            throw new ArgumentException("The address and mask don't use the same IP standard");
        }
    }

    public static IPAddress And(this IPAddress ipAddress, IPAddress mask)
    {
        byte[] addressBytes;
        byte[] maskBytes;
        CheckIPVersion(ipAddress, mask, out addressBytes, out maskBytes);

        byte[] resultBytes = new byte[addressBytes.Length];
        for (int i = 0, e = addressBytes.Length; i < e; ++i)
        {
            resultBytes[i] = (byte)(addressBytes[i] & maskBytes[i]);
        }

        return new IPAddress(resultBytes);
    }
  IPNetwork ipnetwork = IPNetwork.Parse("2001:0db8::/64");

  Console.WriteLine("Network : {0}", ipnetwork.Network);
  Console.WriteLine("Netmask : {0}", ipnetwork.Netmask);
  Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast);
  Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable);
  Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable);
  Console.WriteLine("Usable : {0}", ipnetwork.Usable);
  Console.WriteLine("Cidr : {0}", ipnetwork.Cidr);
Network : 2001:db8::
Netmask : ffff:ffff:ffff:ffff::
Broadcast : 
FirstUsable : 2001:db8::
LastUsable : 2001:db8::ffff:ffff:ffff:ffff
Usable : 18446744073709551616
Cidr : 64
  IPNetwork network = IPNetwork.Parse("::/124");
  IPNetworkCollection ips = IPNetwork.Subnet(network, 128);

  foreach (IPNetwork ip in ips) {
      Console.WriteLine("{0}", ip);
  }
::/128
::1/128
::2/128
::3/128
::4/128
::5/128
::6/128
::7/128
::8/128
::9/128
::a/128
::b/128
::c/128
::d/128
::e/128
::f/128