グローバルIPを取得する

UPnPは関係ないっぽい。
どうも、数回フリーズさせるとそれ以降は問題なく動作するらしい。
しかも、『旋光の輪舞』を昨日からプレーしてますが、今のところフリーズは一度もない。
フリーズしないと決まったわけではないのですが、高確率で落ちるネット対戦をしても落ちなかった。
まだまだネット対戦の経験は少ないのでなんとも言えませんが、もしかしたらクロムのディスクに問題あるのかも。
ディスクがおかしければ途中で止まるのも理解できる。熱暴走っぽい画面の乱れがないのもわかる。
同じくクロムを遊んでいる同僚に頼んで借りてみるのもいいかもしれない。

さて、ネットワークプログラムの勉強がてらに作った簡単なプログラムを公開します。

http://monsho.hp.infoseek.co.jp/files/GetGIP.zip

タイトルにある通り、グローバルIPを取得するプログラムです。
.NET Framework はこういうのも簡単に作れていいね。
ネットゲーム、特にP2Pのネットゲームでは相手のグローバルIPが必要となります。
ホスト側は少なくとも自分のIPを相手に通知しなければなりません。
ゲームをはじめる前の状態では相手はこちらのグローバルIPは知らないので、それを知らせる必要があります。
しかし、自分自身のPC単体でグローバルIPを取得することは基本的に出来ません。
モデムで電話回線と直接繋がっているならできるのかもしれませんが、最近ではルータを使って家庭内でもLANを使用する時代です。
この場合、PCは自分のプライベートIPしか管理していません。外部と繋げるのはあくまでもルータの役目です。
もちろんルータはグローバルIPを知っています。が、それをルータから取得するのも結構面倒です。
なぜならルータはメーカや型によってどこに表示されるかわかりませんし、”グローバルIPアドレス”という名前で表示されているかも不明です。
自分のルータだけ調べればいいのであれば簡単ですが、どんなルータを使っている人でも使えるものには出来ないでしょう。
そこで、一度外部でグローバルIPを調べてもらい、その情報を取得して表示するという方法を使います。
アクセスしてきた相手のグローバルIPを調べるCGIはいろいろなところに置いてあります。
今回は http://checkip.dyndns.org/ を利用します。
実際にアクセスすると自分のグローバルIPが表示されるはずです。
アクセスプログラムは以下の通りです。

String url = "http://checkip.dyndns.org/";
WebClient wc = new WebClient();
Stream st = wc.OpenRead(url);
StreamReader sr = new StreamReader(st, Encoding.GetEncoding("Shift_JIS"));
String htm = sr.ReadToEnd();

WebClient はURIで指定されるリソースとの送受信を行うクラスです。
URI はネット上のリソースの場所を識別するためのものです。URLもこの中に含まれます。
まず WebClient を作成し、読み込みでURLを開きます。
なお、書き込みで URI を開く OpenWrite() メソッドもありますが、普通のサイトは書込み禁止設定になっている(はずなので)失敗すると思われます。
次に StreamReader で開いた URL からテキストを読み込みます。StreamReader はエンコードの設定変更も出来ます。
あとはそこから文字列を抜き出せば、アクセスした時に取得されるHTMLテキストを取得できます。
この段階で htm に入っているのはHTMLのソースです。
ここから xxx.yyy.zzz.www 形式の文字列を抜き出すだけです。
あとはその文字列を好きに使えばいいだけです。どこかに通信して送ってもいいし、このツールのように表示してもかまわないでしょう。
文字列抜き出しは結構強引にやってます。もっとスマートなやり方もあるでしょう。

まあ、これだけなんですけどね。