CIDRからIPアドレスの範囲を求める 

March 06 [Thu], 2008, 1:25
仕事をしていて,CIDR表記からIPアドレスの範囲を求める必要がでてきた。
変換をしてくれるWebアプリもあるし,手作業で計算してもいいのだけど,
やっぱり関数があると便利よね。

ってことで作ってみた。
どげ?


/**
* IPアドレスに関するユーティリティクラス
* @package popylib_net
*/

/**
* IPアドレスに関するユーティリティクラス
*
* @name IPUtils
* @package popylib_net
* @author ueo.ai
* @version 0.1.0
* @access public
*/
class IPUtils
{
/**
* IPアドレスとして妥当か否かを返す
*
* @param string $strIP IPアドレス(192.168.100.1など)
* @return bool IPアドレスとして妥当か否か
*/
public function isValid($strIP)
{
$result = false;

$lngIP = ip2long($strIP);
if($lngIP !== false && long2ip($lngIP) !== '0.0.0.0') {
$result = true;
}

return $result;
}


/**
* CIDRから、IPアドレスの範囲、ホスト数、network、broadcastアドレスを返す
*
* CIDRの異常時、falseを返す
* @param string $cidr CIDR。(192.168.1.0/24など)
* @return array cidr=>CIDR min=>最小ホストIP max=>最大ホストIP hosts=ホスト数 network=>networkアドレス broadcast=>broadcastアドレス
*/
public function getRangeByCidr($cidr) {
$result = array();

list($ip, $mask) = explode('/', $cidr);
// CIDR異常(IP)
if(!$this->isValid($ip)) {
return false;
}
// CIDR異常(mask)
/*
* CIDRは8〜30である。
*/
if(!is_numeric($mask) || !(intval($mask) >= 8 && intval($mask) <= 30)) {
return false;
}

// マスクのビット列を作る
$strBinMask = '';
for($i=1; $i<=32; $i++) {
$strBinMask .= $mask >= $i ? '1' : '0';
}

$lngMask = bindec($strBinMask);
$lngIp = ip2long($ip);
$lngNetwork = ($lngIp & $lngMask);
$lngBroadcast = $lngNetwork | (~$lngMask);

$result['cidr'] = $cidr;
$result['hosts'] = $lngBroadcast - $lngNetwork - 1;
$result['min'] = long2ip($lngNetwork + 1);
$result['max'] = long2ip($lngBroadcast - 1);
$result['network'] = long2ip($lngNetwork);
$result['broadcast'] = long2ip($lngBroadcast - 1);

return $result;
}
}
?>

登録 

March 02 [Sun], 2008, 22:11
ひさしぶりにブログを再開しようと思って登録。
ポップさでヤプログを選択だ。

JavaScriptやらajaxやらの挙動にびっくり。
すごーい。
プロフィール
  • プロフィール画像
  • アイコン画像 ニックネーム:うえお
  • アイコン画像 性別:男性
  • アイコン画像 誕生日:1982年11月18日
  • アイコン画像 血液型:O型
  • アイコン画像 現住所:東京都
  • アイコン画像 職業:会社員
  • アイコン画像 趣味:
    ・グルメ-めずらしい食べ物好き
    ・音楽-ギターをちょろっと弾きます
    ・ダイエット-誰か私の食欲を止めて
読者になる
2年目Webプログラマ。
まだまだへっぽこです。

少ない脳みそをスワップアウトする場所として使ってみようかと思います。
2008年03月
« 前の月  |  次の月 »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
最新コメント
アイコン画像うえお
» CIDRからIPアドレスの範囲を求める (2008年03月10日)
アイコン画像kome
» CIDRからIPアドレスの範囲を求める (2008年03月06日)
アイコン画像うえお
» CIDRからIPアドレスの範囲を求める (2008年03月06日)
アイコン画像koji.k
» 登録 (2008年03月04日)
Yapme!一覧
読者になる