c# - 如何使用 CIDR 表示法查看 IP 地址是否属于 IP 范围内?

标签 c# ip cidr

这里我有一个我需要检查的范围的静态引用:

private static List<string> Ip_Range = new List<string>()
{
    "12.144.86.0/23",
    "31.201.1.176/30",
    "46.36.198.101/32",
    "46.36.198.102/31",
    "46.36.198.104/31",
    "46.136.172.0/24",
    "63.65.11.0/24",
    "63.65.12.0/25",
    "63.65.12.128/26",
    "63.65.12.192/27",
    "63.65.12.224/28",
    "63.65.12.240/29",
    "63.65.12.248/30",
    "63.65.12.252/31",
    "63.65.12.254/32",
    "65.173.56.0/21",
    "67.23.241.179/32",
    "67.23.241.180/30",
    "67.23.241.184/29",
    "67.23.241.192/30",
    "67.23.241.196/31",
    "67.23.241.198/32",
    "72.32.164.56/29",
    "72.46.244.32/28",
    "74.91.16.48/29",
    "74.91.16.208/29",
    "74.91.20.48/28",
    "74.91.20.64/29",
    "74.112.134.120/29",
    "74.112.135.104/29",
    "74.205.37.16/29",
    "78.24.205.32/28",
    "98.129.27.88/29",
    "98.129.91.40/29",
    "166.114.0.0/16",
    "167.157.0.0/16",
    "174.143.165.80/29",
    "186.0.156.0/22",
    "186.2.0.0/17",
    "186.27.0.0/17",
    "190.0.248.0/21",
    "190.3.184.0/21"
};

下面是一些我认为它如何工作的伪代码:

public static bool IpIsWithinRange(string ip) //Something like 127.0.0.1 or 184.56.26.35
{
    IPAddress incomingIp = IPAddress.Parse(ip);
    foreach (var subnet in Ip_Range)
    {
        IPAddress sub = IPAddress.Parse(subnet); ?????
        if (incomingIp "is in" sub) ?
            return true;            
    }
    return false;
}

关于如何编写此功能的代码有什么建议吗?

最佳答案

如果您不想/不能将另一个库(如 IPnetwork 库)添加到您的项目并且只需要处理 IPv4 CIDR 范围,这里有一个快速解决您的问题的方法

// true if ipAddress falls inside the CIDR range, example
// bool result = IsInRange("10.50.30.7", "10.0.0.0/8");
private bool IsInRange(string ipAddress, string CIDRmask)
{
    string[] parts = CIDRmask.Split('/');

    int IP_addr = BitConverter.ToInt32(IPAddress.Parse(ipAddress).GetAddressBytes(), 0);
    int CIDR_addr = BitConverter.ToInt32(IPAddress.Parse(parts[0]).GetAddressBytes(), 0);
    int CIDR_mask = IPAddress.HostToNetworkOrder(-1 << (32 - int.Parse(parts[1])));

    return ((IP_addr & CIDR_mask) == (CIDR_addr & CIDR_mask));
}

以上将允许您快速检查给定的 IPv4 地址是否在给定的 CIDR 范围内;请注意,上面的代码是准系统,在将它们提供给函数之前,您需要检查给定的 IP(字符串)和 CIDR 范围是否正确(您可以只使用 tryparse 或其他...)

关于c# - 如何使用 CIDR 表示法查看 IP 地址是否属于 IP 范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9622967/

相关文章:

mysql - 检查 IP 是否在 CIDR 网络掩码(范围)内

c# - 从堆栈面板的中心开始的元素

c# - 添加类到@Html.ActionLink

php - 如何知道主机名是计算机 "Server"还是个人 "Desktop"

c - 如何用C语言将 "ifconfig"追加到.txt文件中?

python - 如何使用 python3 将 CIDR 转换为 IP 范围?

c# - 实现领域驱动设计

C# 如何从二进制文件中删除换行符?

python - 如何使用 python 套接字连接两台计算机?

networking - 如何检测两个 Golang net.IPNet 对象是否相交?