2005 年 12 月 21 日 22 時 4 分

NAT Traversal はどうする


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


FTP サーバの構築は、ソケット部のプログラムだけなので楽だ。
問題になりそうなのは、NAT Traversal の実装。
UPnP の仕様を確認して実装するのは大変そうだ。
何か楽できないだろうか。調べてみた。

Windows XP 以降には、ICS/ICF という技術基盤がある。
一部として Network Address Translation Traversal があり、
API が公開されていることが分かった。

MSDN ライブラリで調べてみたが、どうやら C API ではなく、
インタフェースベースの API のようだ。
IUPnPNAT が親玉っぽいが、取得方法が分からない。

ヘッダが natupnp.h とあるので探すが手元に見つからない。
仕方ないので、OLEVIEW の Interfaces から IUPnPNAT を探す。
NATUPnP 1.0 Type Library とある。Type Libraries から探す。
見つかったタイプライブラリの中身を開き、coclass を探す。
coclass UPnPNAT が見つかった。

coclass は、簡単に言うと各種言語のクラスと思えばいい。
uuid(AE1E00AA-3FD5-403C-8A27-2BBDC30CD0E1) とある。
これはクラス ID (CLSID) と呼ばれる。クラスの識別子だ。
これを使えば、CoCreateInstance でインスタンスが作成できる。

ついでに、レジストリ HKCR\CLSID から該当キーを探す。
{AE1E00AA-3FD5-403C-8A27-2BBDC30CD0E1} があった。
VersionIndependentProgID に HNetCfg.NATUPnP とある。
また、関連インタフェースを調べると、全て dual 対応だった。
要は VBA などから CreateObject で利用できるってことだ。

早速 Excel の Visual Basic Editor を使ってテストをしてみよう。
イミディエイトウィンドウに入力して試してみる。楽だから。

Set a = CreateObject("HNetCfg.NATUPnP")
Set b = a.StaticPortMappingCollection
Call b.Add(8080, "TCP", 80, "192.168.0.77", True, "XXX")

実行。エラーは起きない。ADSL モデムの管理画面を覗いてみる。
NAT Traversal のエントリが追加されていることが確認できた。
AIREDGE で接続し、外から 8080 番に HTTP で接続してみる。
つながった。どうやら成功のようだ。これは使えるぞ。

実現に一歩近づいた。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.