くまきち

山と旅と家族が大事。
でも激しい物欲が理性と財布のタガを飛ばす
最近は自転車も乗ってる

ネットワークアドレス同士の計算/PHP

2008-11-05 23:25:00 | SEまわり
 あるIPアドレスが、あるネットワークに属するかどうかを調べる場合、PEAR::Net_IPv4::ipInNetwork()が使える。

 でも、「あるネットワークが、あるネットワークに属するかどうか」は分からない。

<?php
 require 'Net/IPv4.php';
 $ip   = '10.11.12.13';
 $net1 = '10.0.0.0/8';
 $net2 = '127.0.0.1/8';
 echo Net_IPv4::ipInNetwork($ip, $net1);
 echo Net_IPv4::ipInNetwork($ip, $net2);
?>

 これの実行結果は、最初が1(true)で、次がnull(false)となる。


 試しに、"$ip = '10.0.1.0/24';"と書いてみたが、falseが返るだけだった。


 なので、Net_IPv4.php を拡張して、ネットワーク対ネットワークの演算ができないかと思った。

 ケースとして、AがneedleでBがhaystackと考える。



図の通り(図にはツッコミ禁止)、考えられる4つのケースのうち、真となるのは1つだけ。


 なので、ネットワークAの両境界アドレス(ネットワークアドレスとブロードキャストアドレスになる)について、その両方がネットワークBに包含されていれば真を返せば良いことになる。

 幸い、Net_IPv4にはcalculate()と言うメソッドがあり、ネットワークアドレスとネットマスクを与えてコールすると、そのネットワークアドレスとブロードキャストアドレスを計算してくれるので、両アドレスをさらに最初に使ったメソッドを使ってチェックすれば良い。

 と言うわけで、解決。