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

Susan Sarandon
发布: 2024-10-18 19:33:29
原创
240 人浏览过

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中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!