引き続きWindowsの名前解決に関して。ルータ越しでサーバのメールスロットにアクセスするとときどき(初回はほぼ必ず、以後不定期に発生)やたら待たされることがあるんだけど、これの原因究明。まず結論から何をやったかというと、lmhostsファイルに#PRE指定でコンピュータ名を記述した。参考にしたのはこのNetBIOS名の名前解決の順序。メールスロットへのアクセスはNetBIOS系のプロトコルなので名前解決はhostsとかDNS系ではなく、WINSとかが使われると言うのが前提。同一ネットワーク内なら通常はブロードキャストとNETBIOS Name Serviceによって名前解決されることが多いと思う(少なくとも俺の知っている「普通」の環境はWINSサーバなんかいないので)のだけど、ルータ越しとなるとまたいろいろと問題がある。この辺は9/3に嵌ったとおり。まあそこを解決したからこそ(遅いながらも)ターゲットのメールスロットにアクセスできるようになったわけなんだけど。
参考URLにあるとおり、NetBIOS名の解決にはNetBIOSネームキャッシュから引くのが最速なので、lmhostsで強制的にキャッシュに乗せておくことで高速化が図れるようだ。もともとの現象であった初回は確実に、以後不定期に遅くなるというのはつまりNetBIOSネームキャッシュに乗っている間は比較的処理が速いと言うと解釈して概ね間違ってないだろう。使用しているPCはHノードなので、この後WINS問い合わせがあって(設定されているけど参照できるかどうか知らない)ブロードキャストの順で処理されて、おそらくブロードキャストで名前解決されてるのでWINSのタイムアウト待ちに時間がかかってるんじゃないかなあという気がする。ルータが絡んでるせいでネットワークが複雑で困る。ネットワークはうちの範囲外なので手は出せないし。まあ範囲内だとしてもルータが絡むようなネットワークなんかまともに設計できないけどな。TE(NW)持ってたって実務じゃこんなもんだ。
そう言えばWindowsAPI上メールスロットに接続するのはCreateFileを使うらしいんだけど、これはメールスロットサーバがリモートコンピュータ上で動いている場合、無条件で(?)成功してしまうらしい。これはMicrosoftのKBかMSDNに書いてあった(URLは忘れた)。ちなみにMSDNのCreateFileの説明ではローカルのメールスロットの場合しか記述がなかったりする。