2012-09-17 233 views
3

可能重复:
How to check a input IP fall in a specific IP range检查IP地址范围

我想检查一个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") 
      }; 
+0

[C#:如何检查输入IP陷在特定IP范围](http://stackoverflow.com/questions/2138706/c-how-to-check-a-input-ip-fall-in-a-specific-ip-range) – opewix

+0

@JesseJames解决方案不在这个答案中工作,我不知道为什么它被接受为正确的! – Tomas

+0

略有不相关性:你也想检查从私人地址开始的IP地址。 – PhonicUK

回答

7

使用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)); 
0

像下面将工作(不编译):

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)。

1
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);