トップ «前の日記(2011-06-09) 最新 次の日記(2011-06-13)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2011-06-11

_ Dns.GetHostAddressesの謎

(追記:hostsに127.0.0.1を設定していたのが原因)

職場の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との比較も行えば良いか)。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え