PHP y direcciones IP

Estoy haciendo un proyecto para gestionar las redes y me he creado algunas funciones para trabajar con direcciones IPs y máscaras. Me gustaría compartirlas porque seguro que hay alguien que mejora este código.

// Devuelve la máscara de un CIDR
function cidr2mask($cidr){
   $numUnos = $cidr;
   $numCeros = 32 - $cidr;
   $binario = str_repeat("1", $numUnos).str_repeat("0", $numCeros);
   $ret = bin2ip($binario);
   return $ret;
}

// Devulve la IP convertida a Int
function ip2int($ipAddress){
$ret = ip2long($ipAddress);
if ($ret < 0) { $ret = pow(2,32) + $ret; } return $ret; } [/sourcecode] [sourcecode language='php'] // Convierte IP Decimal a IP Binaria function ip2bin($ipAddress){ $ret = decbin(ip2int($ipAddress)); $dif = 32 - strlen($ret); if ($dif != 0){ $ret = str_repeat('0', $dif).$ret; } return $ret; } [/sourcecode] [sourcecode language='php'] // Convierte IP Binaria a IP Decimal function bin2ip($ipBinaria){ $ret = long2ip(bindec($ipBinaria)); return $ret; } [/sourcecode] [sourcecode language='php'] // Devuelve TRUE si la IP es correcta. function validaIP($ipAddress){ if(preg_match('/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/',$ipAddress)){ $octetos = explode('.', $ip_addr); foreach ($octetos as $i){ if ((intval($i) >= 0) || (intval($i) <= 255)){ return true; } } } return false; } [/sourcecode] [sourcecode language='php'] // Devuelve TRUE si la máscara es correcta. function validaMascara($mascara){ if (validaIP($mascara)){ $binario = decbin(ip2int($mascara)); if (strlen($binario) == 32){ $partes = explode('0', $binario, 2); if ($partes[1] == 0){ return true; } } } return false; } [/sourcecode] [sourcecode language='php'] // Devuelve la IP de red para la IP y máscara dadas.     function ipRed($ipAddress, $subnetMask){ $ret = '0.0.0.0'; if (validaIP($ipAddress) && validaMascara($subnetMask)){ $binIP = ip2bin($ipAddress); $binMask = ip2bin($subnetMask); $binRed = $binIP & $binMask; $ret = bin2ip($binRed); } return $ret; } [/sourcecode] [sourcecode language='php'] // Devuelve la IP de difusión para la IP y máscara dadas. function ipBcast($ipAddress, $subnetMask){ $ret = '0.0.0.0.0'; if (validaIP($ipAddress) && validaMascara($subnetMask)){ $binIpRed = decbin(ip2long(ipRed($ipAddress, $subnetMask))); $binMask = decbin(ip2long($subnetMask)); $wildcard = str_replace('o', '1', str_replace('1', '0', str_replace('0', 'o', $binMask))); $binIpBca = $binIpRed|$wildcard; $ret = long2ip(bindec($binIpBca)); } return $ret; } [/sourcecode]

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s