【问题标题】:Check if Ip address in range [duplicate]检查IP地址是否在范围内[重复]
【发布时间】:2012-09-17 12:28:59
【问题描述】:

可能重复:
How to check a input IP fall in a specific IP range

我想检查一个 IP 地址是否在私有 IP 地址范围内。我在 .NET 中没有找到任何方法,也不知道如何自己构建它?

例如CheckIsIpPublic("192.168.0.1", upperIp, lowerIp) //should return false

例如CheckIsIpPublic("78.60.143.29", upperIp, lowerIp) //should return true

var upperIp = new List<IPAddress>
             {
               IPAddress.Parse("192.168.0.0"),
               IPAddress.Parse("10.0.0.0"),
               IPAddress.Parse("172.16.0.0"),
               IPAddress.Parse("224.0.0.0")
             };

var lowerIp = new List<IPAddress>
             {
               IPAddress.Parse("192.168.255.255"), 
               IPAddress.Parse("10.255.255.255"), 
               IPAddress.Parse("172.31.255.255"), 
               IPAddress.Parse("255.255.255.255")
             };

【问题讨论】:

  • @JesseJames 该解决方案在该答案中不起作用,我不知道为什么它被认为是正确的!
  • 稍微不相关:您还想检查以 169. 开头的 IP 以获取私有地址。
  • @PhonicUK 169.254.0.0-169.254.255.255 将被添加。谢谢!

标签: c# ip


【解决方案1】:

使用IPNetwork class from Codeplex,您可以执行以下操作:

//see http://en.wikipedia.org/wiki/Reserved_IP_addresses#Reserved_IPv4_addresses
ReadOnlyCollection<IPNetwork> reservedNetworks =
    new ReadOnlyCollection<IPNetwork>(new[]
        {
            IPNetwork.Parse("0.0.0.0/8"),
            IPNetwork.Parse("10.0.0.0/8"),
            IPNetwork.Parse("127.0.0.0/8"),
            IPNetwork.Parse("169.254.0.0/16"),
            IPNetwork.Parse("172.16.0.0/12"),
            IPNetwork.Parse("192.0.2.0/24"),
            IPNetwork.Parse("192.88.99.0/24"),
            IPNetwork.Parse("192.168.0.0/16"),
            IPNetwork.Parse("198.18.0.0/15"),
            IPNetwork.Parse("198.51.100.0/24"),
            IPNetwork.Parse("203.0.113.0/24"),
            IPNetwork.Parse("224.0.0.0/4"),
            IPNetwork.Parse("240.0.0.0/4")
        });

var isInRange = 
  !reservedNetworks.Any(n => IPNetwork.Contains(n, suspiciousIpAddress));

【讨论】:

    【解决方案2】:
    public struct IpRange
    {
        public IPAddress LowerIP;
        public IPAddress UpperIP;
    
        public IpRange(IPAddress lowerIP, IPAddress upperIP)
        {
            LowerIP = lowerIP;
            UpperIP = upperIP;
        }
    }
        public bool CheckIsIpPublic(string adress, List<IpRange> rangeList)
        {
            foreach (var range in rangeList)
            {
                List<int> adressInt = adress.Split('.').Select(str => int.Parse(str)).ToList();
                List<int> lowerInt = range.LowerIP.ToString().Split('.').Select(str => int.Parse(str)).ToList();
                List<int> upperInt = range.UpperIP.ToString().Split('.').Select(str => int.Parse(str)).ToList();
    
                if (adressInt[0] >= lowerInt[0] && adressInt[0] < upperInt[0])
                {
                    return true;
                }
                else if (adressInt[0] >= lowerInt[0] && adressInt[0] == upperInt[0])
                {
                    if (adressInt[1] >= lowerInt[1] && adressInt[1] < upperInt[1])
                    {
                        return true;
                    }
                    else if (adressInt[1] >= lowerInt[1] && adressInt[1] == upperInt[1])
                    {
                        if (adressInt[2] >= lowerInt[2] && adressInt[2] < upperInt[2])
                        {
                            return true;
                        }
                        else if (adressInt[2] >= lowerInt[2] && adressInt[2] == upperInt[2])
                        {
                            if (adressInt[3] >= lowerInt[3] && adressInt[3] <= upperInt[3])
                            {
                                return true;
                            }
                        }
    
                    }
    
                }
            }
            return false;
        }
    

    要运行这个东西,你应该使用

    var rangeList = new List<IpRange>();
    rangeList.Add(new IpRange(IPAddress.Parse("192.168.0.0"),IPAddress.Parse("192.168.255.255")));
    rangeList.Add(new IpRange(IPAddress.Parse("10.0.0.0"),IPAddress.Parse("10.255.255.255")));
    rangeList.Add(new IpRange(IPAddress.Parse("172.16.0.0"),IPAddress.Parse("172.31.255.255")));
    rangeList.Add(new IpRange(IPAddress.Parse("224.0.0.0"),IPAddress.Parse("255.255.255.255")));
    bool result = CheckIsIpPublic("78.60.143.29", rangeList);
    

    【讨论】:

      【解决方案3】:

      类似下面的东西会起作用(未编译):

      public bool IsPrivateIp(string ipAddress)
      {
          return (ipAddress.StartsWith("192.168") || ipaddress.Equals("127.0.0.1") || ipAddress.StartsWith("10.0")) ;
      }
      

      最好为内部 IP 地址留出整个范围 (10.0.0.0 - 10.0.255.255)。

      【讨论】:

        猜你喜欢
        • 2013-08-22
        • 1970-01-01
        • 2017-05-28
        • 2017-05-21
        • 2021-09-08
        • 2014-09-14
        • 2023-03-28
        • 1970-01-01
        • 2012-06-22
        相关资源
        最近更新 更多