Check if Ip address in range
10,814
Solution 1
Using the IPNetwork class from Codeplex, you can do the following:
//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));
Solution 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;
}
and to run this thing you should use
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);
Author by
Tomas
Updated on June 30, 2022Comments
-
Tomas almost 2 years
Possible Duplicate:
How to check a input IP fall in a specific IP rangeI would like to check if a Ip address is in range of private Ip addresses. I do not find any method in .NET and I am not sure how to build it by myself?
For example
CheckIsIpPublic("192.168.0.1", upperIp, lowerIp) //should return false
For example
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") };