
与えられたIPアドレスが、指定した範囲に含まれているか否かをチェックしてくれるような関数、もしくはフリーのプログラムはないでしょうか。
IPアドレスの範囲指定は
IPアドレス/ネットマスク
の型式かまたは
(最小のIPアドレス,最大のIPアドレス)
の型式で与えられるものとします。
具体的にやりたいことは次のようなことです。
そのような関数があるとして、名前をIpcheckとします。
そして、例えば192.168.0.1 は 192.168.0.0/24 に含まれているので、
Ipcheck( 192.168.0.0/24 , 192.168.0.1)
とすると TRUEを返し、
192.168.1.1 は 192.168.0.0/24 に含まれていないので、
Ipcheck( 192.168.0.0/24 , 192.168.1.1)
とするとFAULSを返す
もしくは範囲指定で 192.168.0.1 は 192.168.0.0~ 192.168.0.8に含まれているので
Ipcheck( (192.168.0.0,192.168.0.8) , 192.168.0.1)
とするとTRUEを返す。
という機能が欲しいのです。
実はPHPのスクリプトの中でこういう関数を使いたいのです。しかし、PHPの組込み関数にそういうものは無さそうだし、PHPで組んだらかなりオーバーヘッドになりそうなので、CまたはC++でこういうプログラムがあれば、(関数だったらインターフェイス部分は自作して)system関数で呼び出して使おうと考えています。
PHP(バージョン4)で出来る方法を御存じであれば、そちらも紹介して頂けるとありがたいです。
OSはRedhat Linux 9ですが、なるべくOS依存でないものをご紹介下さい。
No.3ベストアンサー
- 回答日時:
PHPでちょっと作ってみました。
function Ipcheck($range, $ip){
$ip=ip2long($ip);
if(strchr($range,"/")){ #マスク指定
list($address,$len)=split("/", $range);
$address=ip2long($address);
$address=($address >> (32-$len)) << (32-$len);
return ($address == ($ip & $address))? TRUE : FALSE;
} else if(strchr($range,"-")){ #範囲指定
$range=split("-",$range);
$range[0]=ip2long($range[0]);
$range[1]=ip2long($range[1]);
return ($range[0]<=$ip && $ip <= $range[1])? TRUE : FALSE;
}
return FALSE;
}
使い方
$range="192.168.10.20-192.168.10.40";
Ipcheck("192.168.10.0/24", "192.168.0.25");
Ipcheck($range, "192.168.10.25");
ありがとうございますっ!
そうです。これこそ欲しかった機能そのものです。
PHPでもビットシフト演算ができるということは気がつきませんでした(^^;
試してみたらうまくいきました。\(^o^)/
このスクリプトを使わせて頂きます。
本当にありがとうございました。
No.2
- 回答日時:
昼休みにちょこっと作ってみました。
エラーチェックはまったくしてませんので悪しからず。
/*
pChkIpがpMinIpとpMaxIpの
範囲内なら0、
範囲外なら-1を返す
*/
int Ipcheck(char* pMinIp, char* pMaxIp, char* pChkIp)
{
int minIpA, minIpB, minIpC, minIpD;
int maxIpA, maxIpB, maxIpC, maxIpD;
int chkIpA, chkIpB, chkIpC, chkIpD;
sscanf(pMinIp, "%d%*c%d%*c%d%*c%d", &minIpA, &minIpB, &minIpC, &minIpD);
sscanf(pMaxIp, "%d%*c%d%*c%d%*c%d", &maxIpA, &maxIpB, &maxIpC, &maxIpD);
sscanf(pChkIp, "%d%*c%d%*c%d%*c%d", &chkIpA, &chkIpB, &chkIpC, &chkIpD);
if(chkIpA>=minIpA && chkIpA<=maxIpA &&
chkIpB>=minIpB && chkIpB<=maxIpB &&
chkIpC>=minIpC && chkIpC<=maxIpC &&
chkIpB>=minIpD && chkIpD<=maxIpD)
return 0;
else
return -1;
}
ありがとうございますっ!
#3の方がPHPで直接作って下さったので、とりあえずCのプログラムは不用になりましたが、今後の参考にさせて頂きたいと思います。
No.1
- 回答日時:
ていうか、Cが出来るんでしたら作っちゃった方が速いのでは?
IPアドレスやネットワークアドレス、サブネットマスクを文字列から
4バイト(32ビット)の整数にすればすぐですよね。
>そして、例えば192.168.0.1 は 192.168.0.0/24 に含まれているので、
(IPアドレス & サブネットマスク)と(ネットワークアドレス & サブネットマスク)
の比較でできます(&はビットごとのAND演算)。
>もしくは範囲指定で 192.168.0.1 は 192.168.0.0~ 192.168.0.8に含まれているので
ただの数値の範囲チェックですね、こちらは。
アドバイスありがとうございますっ!
IPアドレスを数値データとして直接いじるようなことはやったことがないので、ちょっと難しく考えすぎていたようです。(^^;
でもご教示いただいたことは基本ですよね。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA-指定した範囲で重複しない...
-
【マクロ】実行時エラー '424':...
-
Excel UserForm の表示位置
-
ロックされていないセル内をクリア
-
あああ..ああい..ああう とい...
-
特定の文字がある行以外を削除...
-
結合されたセルをプルダウンの...
-
別ブックをダイアログボックス...
-
マクロの「SaveAs」でエラーが...
-
VBAで、特定の文字より後を削除...
-
エクセルでセルをクリックする...
-
Excelの行数、列数を増やしたい...
-
【VBA】【ユーザーフォーム_Lis...
-
エクセルマクロで、他ブックか...
-
Excel VBA アクティブセルから...
-
空白セルをとばして転記
-
EXCEL VBA 文中の書式ごと複写...
-
エクセルVBAのEntireRow.Hidden...
-
楽天RSSからエクセルVBAを使用...
-
excel セルの結合を条件付で自...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
(UWSC)エクセルのセルの値を読...
-
MATLABによる整定時間の求め方
-
マクロをご教授お願いします
-
初心者ですがセルの変更につい...
-
DHCPサーバで複数のレンジを指...
-
最大値 最小値
-
VBA-指定した範囲で重複しない...
-
ExcelのVBAで教えてください。 ...
-
エクセルVBAでsheet1!B2:B10ま...
-
IPアドレスを検査する関数
-
VBAでオートフィルができません
-
【Excel2002VBA】Destinationを...
-
【マクロ】実行時エラー '424':...
-
複数のエクセルファイルとシー...
-
「段」と「行」の違いがよくわ...
-
エクセルで離れた列を選択して...
-
Excelで、あるセルの値に応じて...
-
特定の文字がある行以外を削除...
-
Excel UserForm の表示位置
-
【Excel関数】UNIQUE関数で"0"...
おすすめ情報