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 &= $mask; // Ensure subnet is aligned return ($ip & $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!