アプリ版:「スタンプのみでお礼する」機能のリリースについて

与えられた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依存でないものをご紹介下さい。

A 回答 (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");
    • good
    • 0
この回答へのお礼

ありがとうございますっ!
そうです。これこそ欲しかった機能そのものです。
PHPでもビットシフト演算ができるということは気がつきませんでした(^^;
試してみたらうまくいきました。\(^o^)/
このスクリプトを使わせて頂きます。
本当にありがとうございました。

お礼日時:2005/01/26 15:11

昼休みにちょこっと作ってみました。


エラーチェックはまったくしてませんので悪しからず。

/*
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;
}
    • good
    • 0
この回答へのお礼

ありがとうございますっ!
#3の方がPHPで直接作って下さったので、とりあえずCのプログラムは不用になりましたが、今後の参考にさせて頂きたいと思います。

お礼日時:2005/01/26 15:17

ていうか、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に含まれているので

ただの数値の範囲チェックですね、こちらは。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございますっ!
IPアドレスを数値データとして直接いじるようなことはやったことがないので、ちょっと難しく考えすぎていたようです。(^^;
でもご教示いただいたことは基本ですよね。
ありがとうございました。

お礼日時:2005/01/26 15:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています