首页  >  文章  >  后端开发  >  如何使用内置函数确定 IP 地址是否在 CIDR 子网内?

如何使用内置函数确定 IP 地址是否在 CIDR 子网内?

Susan Sarandon
Susan Sarandon原创
2024-10-18 19:33:29241浏览

How to Determine If an IP Address is Within a CIDR Subnet Using Built-in Functions?

将 IP 地址与 CIDR 子网匹配

确定 IP 地址是否属于特定 CIDR 子网是网络管理中的一项常见任务。它允许有效映射和管理 IP 范围。

为了满足这一需求,让我们探索函数 cidr_match() 的实现,该函数仅使用内置函数或常用函数执行此匹配。

实现概述

该算法涉及使用 ip2long() 函数将 IP 地址和子网范围转换为长整数。接下来,通过将子网范围的尾随数字(例如“/16”)转换为按位掩码来获得子网掩码。该掩码有效地将 IP 地址拆分为网络前缀和主机后缀。

最后,我们在 IP 地址和子网掩码之间执行按位 AND 运算。如果结果与子网范围匹配,则 IP 地址在指定的 CIDR 子网内。

函数定义

以下是 cidr_match() 函数的实现:

<code class="php">function cidr_match($ip, $range)
{
    list ($subnet, $bits) = explode('/', $range);
    if ($bits === null) {
        $bits = 32;
    }
    $ip = ip2long($ip);
    $subnet = ip2long($subnet);
    $mask = -1 << (32 - $bits);
    $subnet &amp;= $mask; // Ensure subnet is aligned
    return ($ip &amp; $mask) == $subnet;
}</code>

用法示例

在提供的示例中,假设我们有一个 IP 地址数组要检查:

<code class="php">$ips = ['10.2.1.100', '10.2.1.101', '10.5.1.100', '1.2.3.4'];</code>

我们想要验证哪些 IP 属于子网“10.2.0.0/16”:

<code class="php">foreach ($ips as $IP) {
    if (cidr_match($IP, '10.2.0.0/16') == true) {
        print "{$IP} is in the 10.2 subnet\n";
    }
}</code>

输出:

10.2.1.100 is in the 10.2 subnet
10.2.1.101 is in the 10.2 subnet

这演示了 cidr_match() 函数的用法确定 IP 地址是否属于指定的 CIDR 子网。

以上是如何使用内置函数确定 IP 地址是否在 CIDR 子网内?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn