著作一覧 |
職場のWindows Server 2008 (非R2 x64)で、Dns.GetHostAddressesに引数としてstring.Emptyを与える。
foreach (var addr in Dns.GetHostAddresses(string.Empty).Where((addr) => { return addr.AddressFamily == AddressFamily.InterNetwork; })) { System.Console.WriteLine("me: " + addr); }
すると、127.0.0.1と表示される。うーん? と思わなくもないが、間違っているわけでもないので、そういうものと考えることにした。でも、実際には192.なアドレスがアサインされているのだ。
やりたいことは、IPアドレスやホスト名のリストがあり、そこから自分をポイントしているものを抽出することなのだ。
で、string.Emptyではなく、自ホストを与えると、それも127.0.0.1が返ってきたので、まあ、OKであるなぁと。(忘れないように!!:外部に公開しているIPアドレスを与えて試してなかった)
しかし、さっき何気なく家のWindows7 (x64)で似たようなことをやったらびっくり。
表示されるのが、DHCPで得たアドレスと、VirtualBox用の内部アドレスと……と山ほどだ。しかし、127.0.0.1は含まれない。
含まれていれば、別に問題はない。
元のコードは、リリースされるプロダクト用で、リストから得た各エントリーについてやはりIPv4アドレスを列挙して、いずれかが含まれるかを見るから、仮にlocalhostとか書かれていても正しく処理できる。
しかしWindows7で、Dns.GetHostAddressesにlocalhostを与えると127.0.0.1のみが得られる。したがって、同じプログラムは期待する動作をしないことになる。
さて、ある一連の文字列(ホスト名かドット形式のIPアドレス)が自ノードを示すかどうかを互換性を持つ方法で調べるには、どのようにすれば良いのだろう?
うーむ、以前やったなあと思ったら「NET Frameworkで自ホストのIPアドレスを取得する」だ。でも、これで問題があることがわかったので、今や、2008 Serverからhostsは消してあるのだが(自ホストだけを消してもだめなのかな? それともその後、復活させたかな? これも調べる必要がある)。でもこの方法だと自ノードのIPアドレスは取れても、与えられたリストからの取り出しで失敗(ホスト名では127.0.0.1となる)しそうだな(Environemnt.ComputerNameとの比較も行えば良いか)。
ジェズイットを見習え |