在nuget上用这个类库,可以完美解决
IPAddressRange
//ipv4
var rangeA = IPAddressRange.Parse("192.168.0.0/255.255.255.0"); //也支持 "192.168.0.0/24"
rangeA.Contains(IPAddress.Parse("192.168.0.34")); // is True.
rangeA.Contains(IPAddress.Parse("192.168.10.1")); // is False.
//ipv6
var rangeC = IPAddressRange.Parse("fe80::/10");
rangeC.Contains(IPAddress.Parse("fe80::d503:4ee:3882:c586%3")); // is True.
rangeC.Contains(IPAddress.Parse("::1")); // is False.
nuget 包地址:https://www.nuget.org/packages/IPAddressRange
github 仓库地址:https://github.com/jsakamoto/ipaddressrange
基本是这样子.
private static bool IsInSubnet(string ipAddress, string cidr)
{
var parts = cidr.Split('/');
var baseAddress = BitConverter.ToInt32(IPAddress.Parse(parts[0]).GetAddressBytes(),);
var address = BitConverter.ToInt32(IPAddress.Parse(ipAddress).GetAddressBytes(), 0);
var mask = IPAddress.HostToNetworkOrder(-1 << 32 - int.Parse(parts[1]));
return (baseAddress & mask) == (address & mask);
}
chatgpt 给的, 增加了ipv6支持.
private static bool IsInSubnet(string ipAddress, string cidr)
{
var parts = cidr.Split('/');
if (parts.Length != 2)
throw new ArgumentException("Invalid CIDR notation", nameof(cidr));
var network = IPAddress.Parse(parts[0]);
var prefixLength = int.Parse(parts[1]);
var address = IPAddress.Parse(ipAddress);
var networkBytes = network.GetAddressBytes();
var addressBytes = address.GetAddressBytes();
// Ensure both are same address family (IPv4 vs IPv6)
if (networkBytes.Length != addressBytes.Length)
return false;
int fullBytes = prefixLength / 8;
int remainingBits = prefixLength % 8;
// Compare full bytes
for (int i = 0; i < fullBytes; i++)
{
if (networkBytes[i] != addressBytes[i])
return false;
}
// Compare remaining bits (if any)
if (remainingBits > 0)
{
byte mask = (byte)(0xFF << (8 - remainingBits));
if ((networkBytes[fullBytes] & mask) != (addressBytes[fullBytes] & mask))
return false;
}
return true;
}
go 的一个实现 https://github.com/9glt/go-private-ip
– dudu 3个月前typescript 的一个实现
– dudu 3个月前