IPアドレスの判断


モバイル  2010-05-03 19:19:30  No: 102378  IP: [192.*.*.*]

初めまして。
VB6でIPアドレスで携帯キャリアの判別の開発しておりまして、行き詰まってしまって投稿させて頂きました。
携帯のIPアドレスでページを変えようと思っておりますが判断がうまくできません。
配列で判別しようとしたのですがなかなか・・・
PHPとかでは簡単にできるみたいなのですが・・・
どなたかご教授頂ければ幸いです。

210.153.84.0/24
210.136.161.0/24

こういったIP帯を比較し、範囲内であれば指定ページに飛ばすといった感じにしたいです。
飛ばすのは問題なく判別のみをご教授頂ければ幸いです。
宜しくお願い致します。

編集 削除
いっちょかみ  2010-05-05 07:38:22  No: 102379  IP: [192.*.*.*]

モバイルさん

もう少し詳しく記述したほうがいいかもですね。

どんな風に携帯あから情報発信させるの?

携帯からはどんな形で情報が届くの?

その情報をCGIで受取るの?VBで受取るの?

その手順によっては、IP関係なく、いきなり携帯
キャリアがわかりますよ。

perl では$ENV{'HTTP_USER_AGENT'}で携帯キャリ
アがわかりますし・・・・。

どこのタイミングで何を使って調べるのかってこ
とがわからないとネ。

編集 削除
モバイル  2010-05-05 15:47:36  No: 102380  IP: [192.*.*.*]

いっちょかみさんご指摘有り難う御座います。
内容があまり詳しくなくて申し訳御座いません。
只今、VB6で開発しておりますのがIPアドレスからキャリアを出すものを開発しております。
SQLServerにIPアドレスのみのデータがあり、それを見てキャリアを分けたいと思っております。
(今現状ではIPアドレスしかないのでキャリアがわかりません。なので一度全部を見て更新したいと思っております。)
その後、WEB(ASP開発)上にその振り分けできるものを配置したいと思っております。
ASPでもIPアドレスからキャリアに分けるというのがないみたいなのでVB6でできれば応用しようと思っております。
USERAGENTのみだと書き換えでアクセスされる場合がありますのでIPアドレスでも振り分けを行いと思っております。
以上が詳細となります。
宜しくお願い致します。

編集 削除
魔界の仮面弁士  2010-05-06 03:09:55  No: 102381  IP: [192.*.*.*]

> VB6でIPアドレスで携帯キャリアの判別の開発しておりまして、
> 行き詰まってしまって投稿させて頂きました。
> 飛ばすのは問題なく判別のみをご教授頂ければ幸いです。
どの点で行き詰っているのかが読み取れませんでした。

実装中に、何か技術的な問題が起きているのでしょうか。
それとも、IP表を探しているという事なのでしょうか。
http://www.nttdocomo.co.jp/service/imode/make/content/ip/
http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html
http://creation.mb.softbank.jp/web/web_ip.html
http://www.willcom-inc.com/ja/service/contents_service/create/center_info/#01
http://server.ktai.st/support/data/ipaddrs.php


> SQLServerにIPアドレスのみのデータがあり
それらは、どのように管理されていますか?

もし、"210.153.84.1" などの文字列なら、そのままでは比較しにくいので、
32bit 整数として 0〜4,294,967,295 (0x00000000〜0xFFFFFFFF)の値で
管理するか、あるいは "210.153.084.001" などの“固定長文字列”に
整形しておくと、扱いやすいかと思います。

その上で、たとえば「キャリア」「IP始値」「IP終値」の3列管理の表を
  "Willcom","061.198.128.000", "061.198.128.255"
  "DoCoMo", "210.153.084.000", "210.153.084.255"
  "DoCoMo", "210.136.161.000", "210.136.161.255"
あるいは
  "Willcom",0x3DC68000, 0x3DC680FF
  "DoCoMo", 0xD2995400, 0xD29954FF
  "DoCoMo", 0xD288A100, 0xD288A1FF
などの形式で管理しておき、そこから SQL を用いて
  SELECT キャリア FROM 管理表 WHERE @IP BETWEEN IP始値 AND IP終値
のようにして取り出してみては如何でしょう。

編集 削除
モバイル  2010-05-06 13:36:56  No: 102382  IP: [192.*.*.*]

魔界の仮面弁士様
ご教授有り難う御座います。
それで

>> それらは、どのように管理されていますか?

ですが、固定長文字列で管理しております。
ご教授頂いたとおり、やはりSQLでの判断がいいのですね。
本当に有り難う御座いました。
今後、ASP上でアクセスして来た場合にSQLだと負荷がかかるかと思い、配列でやればいいかと思っておりますが如何でしょうか??
もし配列の方が負荷がかからないのであれば、再度ご教授頂ければ幸いです。
宜しくお願い致します。

編集 削除
魔界の仮面弁士  2010-05-06 19:27:17  No: 102383  IP: [192.*.*.*]

> もし配列の方が負荷がかからないのであれば、再度ご教授頂ければ幸いです。
それは、ご自身が実際に検証してみるべき内容だと思いますよ。

> 今後、ASP上でアクセスして来た場合にSQLだと負荷がかかるかと思い、
> 配列でやればいいかと思っておりますが如何でしょうか??

判断材料が不足しているので、答えにくいところではありますが、
このような使い分けになる思います。
(あくまで予想なので、実際の所は測定してみないと分かりませんけれども)


たとえば、大量のログデータ(アクセス元の IP が記録されている)が
DB に記録されているような状況なら、キャリア情報を書き込むために
SQL で一括処理を行う方が早いと思います。

    UPDATE ログ SET キャリア = 管理表.キャリア FROM キャリア
    WHERE ログ.IP BETWEEN 管理表 IP開始値 AND IP終了値


一方、アクセスしてきたキャリアに併せて、ページを動的に
切り替えたいといったケースにおいては、応答性を高めるために、
配列なりコレクションなりにキャッシュしておいた方が早いと思います。
(この場合、IP表が更新された時にキャッシュを更新する機能も必要です)

    CarrierName = "Unknown"
    For Each obj In IPList
      If obj.Contains(IP) Then
        CarrierName = obj.CarrierName
        Exit For
      End If
    Next


あるいは 元データを XML で管理しておいて、DOM に読み込ませた上で
XPath で取り出すという手法もありそうです。

編集 削除
魔界の仮面弁士  2010-05-06 19:32:03  No: 102384  IP: [192.*.*.*]

> UPDATE ログ SET キャリア = 管理表.キャリア FROM キャリア
> WHERE ログ.IP BETWEEN 管理表 IP開始値 AND IP終了値

違うな…こうかな?

UPDATE ログ SET キャリア = 管理表.キャリア FROM 管理表
WHERE ログ.IP BETWEEN 管理表.IP開始値 AND 管理表.IP終了値


# 未検証で書いているので、正しい SQL 構文になっているかどうかは
# 保証できません。あくまで処理イメージという事で…。(^_^;)

編集 削除