2005-05-13

メモ

自宅でサーバをたちあげようとすると二つ問題があって, ひとつは名前の問題. これは dyndns を使うと済む. もう一つは NAT の問題で, これは使っているルータにもよるけれど, UPnP でポートマップをすれば済む. 最初は Windos XP の Universal Plug and Play SDK を使ってみたがいまいちうまくいかず, Windows Firewall API も使い方がよくわからず, Google でみつけた謎の API を使ったら解決した. この API が一体なんなのかは結局よくわからない. しかし動いてはいる. 以下抜粋.

function local_ip_addr() {

var reg0 = new RegExp("IP Address");

var reg1 = new RegExp("192\\.168\\.0\\.(\\d*)");

var shell = new ActiveXObject("WScript.Shell");

var exec = shell.Exec("ipconfig.exe");

while (!exec.StdOut.AtEndOfStream) {

var line = exec.StdOut.ReadLine();

if (reg0.test(line) && reg1.test(line)) {

m = reg1.exec(line);

return m[0];

}

}

return null;

}

var SLEEP_TIME = 60*1000;

var PORT = 8000

WScript.Sleep(SLEEP_TIME); /* ネットワークが ready になるまで待つ. */

var ipaddr = local_ip_addr();

var natupnp = new ActiveXObject("HNetCfg.NATUPnP");

var coll = natupnp.StaticPortMappingCollection;

coll.Add(PORT, "TCP", PORT, ipaddr, true, "Web");

これを "スタート" メニューに入れておけば事が足りるという次第. COM なので JavaScript(JScript) から使える. SDK があれば C++ からも使えるのだろうが, SDK は見当たらず. MSDN の森は深い. Windows は知らない API が山のようにある. なお, サーバを買う資金がなく計画は頓挫した.