
与えられた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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) このプログラミング誰か教えてくれませんか 4 2022/04/29 15:56
- ネットワーク IPアドレスの範囲ってどうやって求めるんですか? 2 2023/01/05 01:37
- VPN 接続のたびにIPが変わるVPNサービスが知りたい 2 2022/06/27 02:34
- Wi-Fi・無線LAN iPhoneのIPアドレスは機内モードをオンで変わるように、無線ルーターも何かの方法で変更できる? 2 2022/04/02 14:37
- ネットワーク 一台のサーバーに複数個のIPアドレスを追加出来る事は知っていますが、具体的にどうやるのでしょうか? 4 2022/11/03 20:12
- VPN 無料のwifiはなぜ危険性高い? VPN プライベートDNSモードにすれば安全? 2 2022/06/04 18:23
- その他(インターネット接続・インフラ) アプリ利用者を特定し、裁判に 2 2022/06/09 21:43
- Oracle ビットで表せる数値について 3 2022/09/12 16:37
- YouTube パソコンのIPアドレスを複数、持つことに関して、法律に違反ですか。 9 2022/06/23 18:20
- Windows 10 インストールしたてのVirtualBoxの仮想マシンにDHCPで割り振られるIPアドレスにつきまして 1 2023/05/03 14:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
(UWSC)エクセルのセルの値を読...
-
MATLABによる整定時間の求め方
-
VBA-指定した範囲で重複しない...
-
ExcelのVBAで教えてください。 ...
-
「段」と「行」の違いがよくわ...
-
【Excel関数】UNIQUE関数で"0"...
-
特定の文字がある行以外を削除...
-
VBA 別ブックからコピペしたい...
-
エクセルで離れた列を選択して...
-
Worksheets メソッドは失敗しま...
-
別ブックをダイアログボックス...
-
Excel グラフのプロットからデ...
-
VBA シートをコピーする際に Co...
-
[EXCEL]ボタン押す→時刻が表に...
-
vbaで指定したセルより下の行を...
-
vba 2つの条件が一致したら...
-
Excelのフィルター後の一番上の...
-
Cellsのかっこの中はどっちが行...
-
DataGridViewに空白がある場合...
-
マクロの「SaveAs」でエラーが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
(UWSC)エクセルのセルの値を読...
-
【Excel2002VBA】Destinationを...
-
VBA-指定した範囲で重複しない...
-
VBでエクセルを制御したい
-
MATLABによる整定時間の求め方
-
IPアドレスを検査する関数
-
VBAでオートフィルができません
-
EXCEL VBA 別シートの文字を...
-
DHCPサーバで複数のレンジを指...
-
ExcelのVBAで教えてください。 ...
-
特定の文字がある行以外を削除...
-
「段」と「行」の違いがよくわ...
-
Excelで、あるセルの値に応じて...
-
VBA シートをコピーする際に Co...
-
vba 2つの条件が一致したら...
-
エクセルで離れた列を選択して...
-
Worksheets メソッドは失敗しま...
-
【Excel関数】UNIQUE関数で"0"...
-
B列の最終行までA列をオート...
-
EXCELのSheet番号って変更でき...
おすすめ情報