今回はプレフィクス表記のIP帯域情報から長整数型のネットワークアドレス(先端)とブロードキャストアドレス(終端)の数値を得るPHPスクリプトについて紹介します。
アクセスしてきたIPアドレスがその帯域に含まれるかどうかを調べる際、そのままの形式では大小比較ができないためプレフィクス表記から一度長整数型のネットワークアドレス(先端)とブロードキャストアドレス(終端)を取得すデータベース化しておくことを想定したスクリプトとなります。
<?php
// IP帯域(プレフィクス表記)
$ipv4 = "153.177.38.0/23";
// ip部・Prefix部分割
list($ip, $prefix) = explode('/', $ipv4);
// Prefix部からサブネットマスク(2進数)生成
$str = "";
$j=0;
for($i=1; $i<=32; $i++){
$j++;
if($j <= $prefix){
$str .= "1";
} else {
$str .= "0";
}
}
$address = array();
$address = stringSplitArray($str, 0, 8);
$address1 = bindec($address[0]);
$address2 = bindec($address[1]);
$address3 = bindec($address[2]);
$address4 = bindec($address[3]);
$netmask = $address1.".".$address2.".".$address3.".".$address4;
// networkアドレスとbroadcastアドレス算出
$network2 = ip2long($ip) & ip2long($netmask);
$broadcast2 = ip2long($ip) | (ip2long($netmask) ^ ip2long('255.255.255.255'));
$network1 = long2ip($network2);
$broadcast1 = long2ip($broadcast2);
echo "networkアドレス:".$network1." broadcastアドレス:".$broadcast1;
exit;
}
function stringSplitArray($str, $position, $number, $encode = "utf-8")
{
$results = array();
do
{
$cut_str = mb_substr($str, $position, $number, $encode);
if($cut_str != '')
{
$results[] = $cut_str;
}
$position += $number;
} while($cut_str != '');
return $results;
}
?>
上記スクリプトもネット情報を調べつつアレンジしたものですので、コードはもしかするともっとシンプルにできるかもしれません。
あまり使う機会のないスクリプトからしれませんがお役に立てば幸いです。
