Ver Mensaje Individual
  #8 (permalink)  
Antiguo 25/08/2015, 12:49
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Comparar IP's

Código PHP:
Ver original
  1. <?php
  2.     class Ipv4Network {
  3.         /*/
  4.          * Bits fijos de cada clase.
  5.         /*/
  6.         const CLASS_A = 8;
  7.         const CLASS_B = 16;
  8.         const CLASS_C = 24;
  9.  
  10.         /*/
  11.          * Tipos de ip.
  12.         /*/
  13.         const IP_TYPE_NONE = "No pertenece";
  14.         const IP_TYPE_NETWORK = "Es una direccion de red";
  15.         const IP_TYPE_HOST = "Es un host";
  16.         const IP_TYPE_BROADCAST = "Es un broadcast";
  17.  
  18.         /*/
  19.          * Bits de la clase actual.
  20.         /*/
  21.         private $bClass;
  22.         /*/
  23.          * Bits de la mascara actual, debe ser mayor o igual a $bClass.
  24.         /*/
  25.         private $mask;
  26.         /*/
  27.          * Direccion de red completa.
  28.         /*/
  29.         private $network;
  30.         /*/
  31.          * Representacion binaria de la red.
  32.         /*/
  33.         private $bNetwork;
  34.  
  35.         private function toBinary($ip, $bits = 8) {
  36.             $binary = "";
  37.             if($bits > 0) {
  38.                 foreach(explode(".", $ip) as $part)
  39.                     $binary .= sprintf('%0'.$bits.'d', decbin($part));
  40.             }
  41.  
  42.             return $binary;
  43.         }
  44.  
  45.         public function __construct($network, $mask, $bClass) {
  46.             $this->mask = $mask;
  47.             $this->bClass = $bClass;
  48.             $this->network = $network;
  49.             $this->bNetwork = $this->toBinary($network);
  50.         }
  51.  
  52.         public function getType($ip) {
  53.             $ipBinary = $this->toBinary($ip);
  54.            
  55.             if(substr($this->bNetwork, 0, $this->bClass) !== substr($ipBinary, 0, $this->bClass))
  56.                 return self::IP_TYPE_NONE;
  57.            
  58.             $ipBinary = substr($ipBinary, $this->bClass);
  59.  
  60.             $subnetBits = $this->mask - $this->bClass;
  61.             $hostsBits = 32 - $this->mask;
  62.             $subnetCount = pow(2, $subnetBits);
  63.            
  64.             $hostBase = $this->toBinary(0, $hostsBits);
  65.             for($sNro = 0; $sNro < $subnetCount; $sNro++) {
  66.                 $subnet = $this->toBinary($sNro, $subnetBits);
  67.                 $broad = $subnet.$this->toBinary(bindec($hostBase) + pow(2, $hostsBits) - 1, $hostsBits);
  68.                
  69.                 if($ipBinary === $subnet.$hostBase)
  70.                     return self::IP_TYPE_NETWORK;
  71.                 elseif($ipBinary === $broad)
  72.                     return self::IP_TYPE_BROADCAST;
  73.                 elseif($ipBinary < $broad)
  74.                     return self::IP_TYPE_HOST;
  75.             }
  76.         }
  77.     }
  78.  
  79.     $ipv4Net = new Ipv4Network("192.168.1.0", 25, Ipv4Network::CLASS_C);
  80.     echo $ipv4Net->getType("192.168.1.0")."<br>";
  81.     echo $ipv4Net->getType("192.168.1.255")."<br>";
  82.     echo $ipv4Net->getType("192.168.1.127")."<br>";
  83.     echo $ipv4Net->getType("192.168.1.128")."<br>";
  84.     echo $ipv4Net->getType("192.168.1.120")."<br>";
  85.     echo $ipv4Net->getType("192.168.1.220")."<br>";
  86.     echo $ipv4Net->getType("191.168.1.220")."<br>";

Arme ese codigo, lo que no recuerdo ahora, es si por ejemplo el subnetting de:
192.168.1.0/25
es el mismo que el de:
192.168.1.1/25

si es lo mismo, entonces el codigo te sirve, sino hay que ajustar la linea 64 para que en vez de partir del numero 0, arranque desde el que corresponda.
tampoco recuerdo que pasaba en esos casos con las direcciones sobrantes al final, si quedaban inutilizadas o que pasaba.

En fin, te puede servir como orientacion de todas formas
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios