首頁 >後端開發 >php教程 >如何使用內建函數確定 IP 位址是否在 CIDR 子網路內?

如何使用內建函數確定 IP 位址是否在 CIDR 子網路內?

Susan Sarandon
Susan Sarandon原創
2024-10-18 19:33:29346瀏覽

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>

用法

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

<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>
用法例如🎜>在提供的範例中,假設我們有一個IP 位址陣列要檢查:

10.2.1.100 is in the 10.2 subnet
10.2.1.101 is in the 10.2 subnet
我們想要驗證哪些IP 屬於子網路「10.2.0.0/16」:

輸出:這示範了cidr_match() 函數的用法確定IP 位址是否屬於指定的CIDR 子網路。

以上是如何使用內建函數確定 IP 位址是否在 CIDR 子網路內?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn