C# 检查Ip地址是否在范围内
可能重复:C# 检查Ip地址是否在范围内,c#,ip,C#,Ip,可能重复: 我想检查Ip地址是否在专用Ip地址范围内。我在.NET中找不到任何方法,也不知道如何自己构建它 例如CheckIsIpPublic(“192.168.0.1”,upperIp,lowerIp)//应该返回false 例如CheckIsIpPublic(“78.60.143.29”,upperIp,lowerIp)//应该返回true var upperIp = new List<IPAddress> { IPAdd
我想检查Ip地址是否在专用Ip地址范围内。我在.NET中找不到任何方法,也不知道如何自己构建它 例如
CheckIsIpPublic(“192.168.0.1”,upperIp,lowerIp)//应该返回false
例如CheckIsIpPublic(“78.60.143.29”,upperIp,lowerIp)//应该返回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")
};
var upperIp=新列表
{
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=新列表
{
IPAddress.Parse(“192.168.255.255”),
IPAddress.Parse(“10.255.255.255”),
IPAddress.Parse(“172.31.255.255”),
IPAddress.Parse(“255.255.255.255”)
};
类似于以下内容的操作(未编译):
如果为内部IP地址(10.0.0.0-10.0.255.255)留出一个完整的范围,则效果最佳。使用,可以执行以下操作:
//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));
//请参见http://en.wikipedia.org/wiki/Reserved_IP_addresses#Reserved_IPv4_addresses
只读收集保留数据网络=
新建只读集合(新建[]
{
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”)
});
变量isInRange=
!reservedNetworks.Any(n=>IPNetwork.Contains(n,猜疑pAddress));
公共结构IpRange
{
公共IP地址;
公共IP地址;
公共IpRange(IPAddress lowerIP、IPAddress upperIP)
{
LowerIP=LowerIP;
UpperIP=UpperIP;
}
}
public bool checkispppublic(字符串地址,列表范围列表)
{
foreach(范围列表中的变量范围)
{
List address=address.Split('.')。选择(str=>int.Parse(str)).ToList();
列出lowerInt=range.LowerIP.ToString().Split('.')。选择(str=>int.Parse(str)).ToList();
列出upperInt=range.UpperIP.ToString().Split('.')。选择(str=>int.Parse(str)).ToList();
if(地址[0]>=lowerInt[0]&&address[0]=lowerInt[0]&地址[0]==upperInt[0])
{
if(地址[1]>=lowerInt[1]&地址[1]=lowerInt[1]&地址[1]==upperInt[1])
{
if(地址[2]>=lowerInt[2]&地址[2]=lowerInt[2]&地址[2]==upperInt[2])
{
如果(adressInt[3]>=lowerInt[3]&&adressInt[3]@JesseJames该解决方案在该答案中不起作用,我不知道为什么它被认为是正确的!稍微无关:您还想检查起始于169的IP地址。有关私人地址,将添加@PhonicUK 169.254.0.0-169.254.255.255。谢谢!
//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));
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);