- ベストアンサー
IPアドレスを検査する関数
与えられた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依存でないものをご紹介下さい。
- みんなの回答 (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");
その他の回答 (2)
- yasuch
- ベストアンサー率41% (27/65)
昼休みにちょこっと作ってみました。 エラーチェックはまったくしてませんので悪しからず。 /* 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のプログラムは不用になりましたが、今後の参考にさせて頂きたいと思います。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
ていうか、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アドレスを数値データとして直接いじるようなことはやったことがないので、ちょっと難しく考えすぎていたようです。(^^; でもご教示いただいたことは基本ですよね。 ありがとうございました。
お礼
ありがとうございますっ! そうです。これこそ欲しかった機能そのものです。 PHPでもビットシフト演算ができるということは気がつきませんでした(^^; 試してみたらうまくいきました。\(^o^)/ このスクリプトを使わせて頂きます。 本当にありがとうございました。