あるIPアドレスが、あるネットワークに属するかどうかを調べる場合、PEAR::Net_IPv4::ipInNetwork()が使える。
でも、「あるネットワークが、あるネットワークに属するかどうか」は分からない。
これの実行結果は、最初が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()と言うメソッドがあり、ネットワークアドレスとネットマスクを与えてコールすると、そのネットワークアドレスとブロードキャストアドレスを計算してくれるので、両アドレスをさらに最初に使ったメソッドを使ってチェックすれば良い。
と言うわけで、解決。
でも、「あるネットワークが、あるネットワークに属するかどうか」は分からない。
<?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()と言うメソッドがあり、ネットワークアドレスとネットマスクを与えてコールすると、そのネットワークアドレスとブロードキャストアドレスを計算してくれるので、両アドレスをさらに最初に使ったメソッドを使ってチェックすれば良い。
と言うわけで、解決。