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 が山のようにある. なお, サーバを買う資金がなく計画は頓挫した.