Esses tempos tive a necessidade de obter uma lista de todos os ips contidos em um range.
Se fossem somente ranges /24 seria muito fácil, porém para o sistema que eu estava desenvolvendo havia necessidade de escalabilidade, podendo ser inserido qualquer range como /16 /30 /28, etc.
Depois de procurar muito no oráculo google achei algo que se aproximava do que eu precisava, a classe net/ipv4 do PEAR, eu digo que se aproximava porque ela retorna o primeiro e o último IP de qualquer range, mas não a lista completa.
Com a classe ipv4 em mãos, resolví escrever a function abaixo que me retorna a lista completa:
function calculateIpRange($cidr) {
$cidr = trim($cidr);
if(!preg_match("/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/[0-9]{1,2}/", $cidr)){
return Array(false, 'O IP deve estar no formato XXX.XXX.XXX.XXX/XX --> Exemplo 192.168.0.50/28');
}
if(!@include_once 'Net/IPv4.php')
{
return Array(false, 'Classe Net_IPv4 não está instalada --> http://pear.php.net/package/Net_IPv4/');
}
if(!is_callable('Net_IPv4', 'parseAddress'))
{
return Array(false, 'Metodo Net_IPv4::parseAddress inexistente');
}
$ip_calc = Net_IPv4::parseAddress($cidr);
if($ip_calc->message)
{
return Array(False, $ip_calc->message);
}
$s = sprintf("%u",ip2long($ip_calc->network));
$e = sprintf("%u",ip2long($ip_calc->broadcast));
for($i=$s;$i<=$e;$i++){
$r[] = long2ip($i);
}
return Array(
true,
'info' => Array(
'total' => sizeof($r),
'source' => $cidr,
'network' => $ip_calc->network,
'broadcast' => $ip_calc->broadcast,
'netmask' => $ip_calc->netmask
),
'data' => $r
);
}
NOTA: Este método necessita da classe net/ipv4 do pear instalada no servidor, o que pode ser realizado com o comando abaixo:
pear install Net_IPv4-1.3.4
Na dúvida, consulte seu provedor para instalação da mesma no servidor 😉
———————————————-
Posted Listening: “Starblind – Iron Maiden”