Maison  >  Article  >  développement back-end  >  Comment déterminer si une adresse IP se trouve dans un sous-réseau CIDR à l'aide des fonctions intégrées ?

Comment déterminer si une adresse IP se trouve dans un sous-réseau CIDR à l'aide des fonctions intégrées ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-18 19:33:29241parcourir

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

Faire correspondre les adresses IP aux sous-réseaux CIDR

Déterminer si une adresse IP appartient à un sous-réseau CIDR spécifique est une tâche courante dans l'administration réseau. Il permet un mappage et une gestion efficaces des plages IP.

Pour répondre à ce besoin, explorons l'implémentation d'une fonction, cidr_match(), qui effectue cette correspondance en utilisant uniquement des fonctions intégrées ou communes.

Aperçu de la mise en œuvre

L'algorithme consiste à convertir l'adresse IP et la plage de sous-réseaux en entiers longs à l'aide de la fonction ip2long(). Ensuite, le masque de sous-réseau est obtenu en convertissant les chiffres de fin de la plage de sous-réseau (par exemple, "/16") en un masque au niveau du bit. Ce masque divise efficacement l'adresse IP en un préfixe de réseau et un suffixe d'hôte.

Enfin, nous effectuons une opération ET au niveau du bit entre l'adresse IP et le masque de sous-réseau. Si le résultat correspond à la plage de sous-réseau, alors l'adresse IP se trouve dans le sous-réseau CIDR spécifié.

Définition de la fonction

Voici l'implémentation de la fonction 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>

Exemple d'utilisation

Dans l'exemple fourni, supposons que nous ayons un tableau d'adresses IP à vérifier :

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

Nous souhaitez vérifier laquelle de ces adresses IP appartient au sous-réseau "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>

Sortie :

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

Cela démontre l'utilisation de la fonction cidr_match() pour déterminer si une adresse IP appartient à un sous-réseau CIDR spécifié.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn