如何比较C#中的IP地址范围?
如果我有一个IP地址范围(CIDR表示法),我需要知道某个任意IP地址是否在该范围内(都以字符串形式表示),那么使用C#最简单的方法是什么 示例:如何比较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 {
- IPv4范围:
,要检查的IP:192.168.168.100/24
192.168.168.200
- IPv6范围:
,要检查的IP:fe80::202:b3ff:fe1e:8329/24
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”。所以我不知道。。。