• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答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");

horagai
質問者

お礼

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

その他の回答 (2)

  • yasuch
  • ベストアンサー率41% (27/65)
回答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; }

horagai
質問者

お礼

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

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答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に含まれているので ただの数値の範囲チェックですね、こちらは。

horagai
質問者

お礼

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

関連するQ&A

  • IPアドレスについて教えて下さい。

    IPアドレスについて教えて下さい。(クラスCを例にします) クラスCは、192.0.0.0~223.255.255.255の範囲でIPアドレスが割り当てられますが、 192.0.0.0~192.167.255.255→グローバル 192.168.0.0~192.168.255.255→プライペート 192.169.0.0~223.255.255.255→グローバル ということなのでしょうか? すみません。よろしくお願いします。

  • IPアドレスを暗号化

    今PHPで掲示板を作っていまして投稿者のIPアドレスを暗号化して表示しようと思ってます。 例えば名前を変えて投稿しても同じIPアドレスなら同じ表示(数字や英字)が出るようにしたいんです。 接続を切ってしまえばIPアドレスは変わってしまうのですが、少し位自作自演がなくなるのではないかと思いまて。 それでPHPで数字を暗号化するような事はできるのでしょうか? まだPHPを初めて間もないので作り方が載っているサイト等がありましたら教えてください。 またこの関数を使えばできる等のヒントでも構いません。 よろしく御願いします。 PHP4.3.7です。

    • ベストアンサー
    • PHP
  • IPアドレスが書き込めません

    OS WIN98se tcp/ip プロパティーでIPアドレスを指定するをクリックして アドレスを書き込むところにカーソルが出てきません。 そのためにアドレス指定ができなくて困っています。 マウスでのカーソルを入力テキストボックスでクリックしても カーソルが現れません。どうすればよいのでしょうか?。

  • IPアドレスによる振り分け

    携帯サイトを作成しています。 PHPでの「IPアドレスによる振り分け」を行いたいです。 各キャリアのIPアドレスを調べてみました。 (docomo,au,softbank) 振り分け方についてなのですが、 どんな関数を使用すれば可能でしょうか?

    • 締切済み
    • PHP
  • RedhatのIPアドレスを固定に切り替える方法

    RedHat7.0をインストールしたときにIPアドレスをDHCPサーバーから取得するように設定しました。 これを固定でIPアドレスを指定するように変更したいのですが、どこで変更したらいいのか分かりません。HPなどいろいろ探したのですが見つからないので教えてください。 よろしくお願いします。

  • IPアドレスを取得する

    IPアドレスを取得するプログラムを作りたいのですが、 そのような関数はあるのでしょうか? ご存知の方がいらしたら教えてください。 お願いします。

  • BシェルでのIPアドレス範囲判定

    こんにちは。 Bシェルにて、IPアドレスの範囲におさまっているかどうかの 判定を行う処理になりますが、このような関数など、ご存知の方が いればお願いします。 OSは、HP-UXになります。 例:192.168.1.0~192.168.1.255のIP範囲として、 192.168.1.11が、IP範囲かどうかを調べる処理です。

  • グローバルIPアドレスとプライベートIPアドレスについて。

    グローバルIPアドレスとプライベートIPアドレスについて。 グローバルIPアドレスにはプライベートIPアドレスのCLASS A~Cに割り当てられているIPアドレスを含んでいるのですか? グローバルIPの個数が2の32乗の43億個といわれているので、このプライベートIPアドレスのCLASSも個数に含まれていると思います。そうなるとプライベートIPアドレスでCLASSの概念が必要ないのではないかと思っています。NATの機能もありますし、わざわざCLASSを指定する意味があるのでしょうか? 自分の中で筋が通らない部分がありますので、専門家の方ご教授よろしくお願いします。

  • IPアドレス/識別について

    LANにしてネット回線・プロバを共有する場合、IPアドレスも共有する形 になりますが、IPアドレスが及ぶ範囲というのを教えてください。 例えば、1台のPCからネットに繋いでOKWEBのログインをしたら、 他のPCからネットに繋いでもログインしたことになっているのでしょうか? IP、ブラウザ、OSなど、何が何によって識別されているのかわかりません。 そういった知識を紹介しているお勧めのサイトなどもあったらおねがいします。

  • 関数が呼び出されるごとに文字列(IPアドレス)を格納したいのですが・・・

    こんばんは。 関数が呼び出されるごとに文字列(IPアドレス)を格納したいと思っているのですが、どのように記述すればよいか分かりません。 以下にプログラムを示します。 以下のプログラムは、int UDPReceive_IPaddr関数のwhileループ内のIPaddrstorage関数が呼び出されるたびに、IPaddrstorage関数内にて配列を用いて他の端末のIPアドレスを格納したいと考えています。 しかし、関数が毎回呼び出されるため、配列の記述の仕方に困っています。なにか解決方法はありますでしょうか? [プログラム] int UDPReceive_IPaddr(u_short portNo) { char IPaddr[16]; int size; //他の端末からIPアドレスをHELLO文字列(パケット)を受信することで知る。 while(1){ if(size == 5){ if(memcmp(recv_Buf,"HELLO",5) == 0){ strcpy(IPaddr,inet_ntoa(from.sin_addr)); IPaddrstorage(IPaddr); } } } int IPaddrstorage(char *IPaddr){ //配列を用いて、他の端末のIPアドレスを格納したいと考えています。 return 0; } よろしくお願いします。

専門家に質問してみよう