如何比较C#中的IP地址范围?

如何比较C#中的IP地址范围?,c#,ipv6,ipv4,cidr,C#,Ipv6,Ipv4,Cidr,如果我有一个IP地址范围(CIDR表示法),我需要知道某个任意IP地址是否在该范围内(都以字符串形式表示),那么使用C#最简单的方法是什么 示例: IPv4范围:192.168.168.100/24,要检查的IP:192.168.168.200 IPv6范围:fe80::202:b3ff:fe1e:8329/24,要检查的IP:2001:db8:: 我不会为您编写代码,但: 应该足够让你开始了 祝你好运这里有一个简单的课程: public class IPSubnet {

如果我有一个IP地址范围(CIDR表示法),我需要知道某个任意IP地址是否在该范围内(都以字符串形式表示),那么使用C#最简单的方法是什么

示例:

  • IPv4范围:
    192.168.168.100/24
    ,要检查的IP:
    192.168.168.200
  • IPv6范围:
    fe80::202:b3ff:fe1e:8329/24
    ,要检查的IP:
    2001:db8::

    • 我不会为您编写代码,但:

      应该足够让你开始了

      祝你好运这里有一个简单的课程:

      public class IPSubnet
      {
          private readonly byte[] _address;
          private readonly int _prefixLength;
      
          public IPSubnet(string value)
          {
              if (value == null)
                  throw new ArgumentNullException("value");
      
              string[] parts = value.Split('/');
              if (parts.Length != 2)
                  throw new ArgumentException("Invalid CIDR notation.", "value");
      
              _address = IPAddress.Parse(parts[0]).GetAddressBytes();
              _prefixLength = Convert.ToInt32(parts[1], 10);
          }
      
          public bool Contains(string address)
          {
              return this.Contains(IPAddress.Parse(address).GetAddressBytes());
          }
      
          public bool Contains(byte[] address)
          {
              if (address == null)
                  throw new ArgumentNullException("address");
      
              if (address.Length != _address.Length)
                  return false; // IPv4/IPv6 mismatch
      
              int index = 0;
              int bits = _prefixLength;
      
              for (; bits >= 8; bits -= 8)
              {
                  if (address[index] != _address[index])
                      return false;
                  ++index;
              }
      
              if (bits > 0)
              {
                  int mask = (byte)~(255 >> bits);
                  if ((address[index] & mask) != (_address[index] & mask))
                      return false;
              }
      
              return true;
          }
      }
      
      示例用法:

      Console.WriteLine(new IPSubnet("192.168.168.100/24").Contains("192.168.168.200")); // True
      Console.WriteLine(new IPSubnet("fe80::202:b3ff:fe1e:8329/24").Contains("2001:db8::")); // False
      

      此类将所有IPv4地址视为不同于所有IPv6地址,不尝试在IPv4和IPv6之间进行转换。

      我建议使用IPNetwork Library。 从版本2开始,它还支持IPv4和IPv6

      IPv6

        IPNetwork ipnetwork = IPNetwork.Parse("fe80::202:b3ff:fe1e:8329/24");
      
        IPAddress ipaddress = IPAddress.Parse("2001:db8::");
        IPAddress ipaddress2 = IPAddress.Parse("fe80::202:b3ff:fe1e:1");
      
        bool contains1 = IPNetwork.Contains(ipnetwork, ipaddress);
        bool contains2 = IPNetwork.Contains(ipnetwork, ipaddress2);
      
        Console.WriteLine("{0} contains {1} : {2}", ipnetwork, ipaddress,     contains1);
        Console.WriteLine("{0} contains {1} : {2}", ipnetwork, ipaddress2,     contains2);
      
      输出

         fe80::/24 contains 2001:db8:: : False
         fe80::/24 contains fe80::202:b3ff:fe1e:1 : True
      
        192.168.168.0/24 contains 192.168.168.200 : True
        192.168.168.0/24 contains 192.168.0.200 : False
      
      IPv4

        IPNetwork ipnetwork = IPNetwork.Parse("192.168.168.100/24");
      
        IPAddress ipaddress = IPAddress.Parse("192.168.168.200");
        IPAddress ipaddress2 = IPAddress.Parse("192.168.0.200");
      
        bool contains1 = IPNetwork.Contains(ipnetwork, ipaddress);
        bool contains2 = IPNetwork.Contains(ipnetwork, ipaddress2);
      
        Console.WriteLine("{0} contains {1} : {2}", ipnetwork, ipaddress, contains1);
        Console.WriteLine("{0} contains {1} : {2}", ipnetwork, ipaddress2, contains2);
      
      输出

         fe80::/24 contains 2001:db8:: : False
         fe80::/24 contains fe80::202:b3ff:fe1e:1 : True
      
        192.168.168.0/24 contains 192.168.168.200 : True
        192.168.168.0/24 contains 192.168.0.200 : False
      

      玩得开心

      太糟糕了,因为不太清楚如何进行比较。例如,如果范围是ipv6符号,但地址是ipv4,反之亦然,该怎么办?另外,仅将子网掩码应用于ipv6地址也不清楚。网络上没有很多这样的例子……我不知道你的意思是什么?IPv4和IPv6是两个完全不同的东西。IPv4将不使用IPv6表示法。我不会像对待其他IPv6地址一样对待::192.168.1.1。您是否有兴趣看到只使用IPv4的解决方案?没有。IPv4非常简单。使其具有挑战性的是ipv6,或者当这两种格式混合使用时。从这里缺乏回应来看,似乎没有多少人关心这件事……谢谢。例如,尽管IPv4应转换为IPv6,但您可以使用“::192.168.168.100”,您的代码会将其视为IPv6。您确定只需在IPv4地址的前面加上“:”,即可将其转换为IPv6吗?Wikipedia文章没有将此列为IPv4转换机制之一。很抱歉延迟。我是在网上找到的,如果你搜索“将Ipv4转换为IPv6”。所以我不知道。。。