著作一覧 |
なんとなく、.NET Frameworkを使えば簡単にアドレスを取れると思っていたが、実際にはそんなに単純でもなかったのでメモ。
検索で比較的上位に出てくるのはDnsにホスト名を与える方法だが、イントラネットやルータ内部では役に立たない(もしかしたら役に立つ環境があるのかも知れないが(追記:どちらかというと、役に立たない環境のほうが異常だとわかったが、種々の制約からそういう環境もある)、試した限り127.0.0.1のループバックアドレスになる)。したがって、アダプタ情報を列挙していくしかない。
後、IPv6のアドレスだったりすることがあるので、IPv4のアドレスが欲しければ、そこでもフィルタリングが必要。
結局、以下のようになった(.NET Framework 2.0以降)。
using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; public class MyAddress { public static void Main() { foreach (var intf in NetworkInterface.GetAllNetworkInterfaces()) { if (intf.Supports(NetworkInterfaceComponent.IPv4)) { foreach (var addrInf in intf.GetIPProperties().UnicastAddresses) { if (addrInf.Address.AddressFamily == AddressFamily.InterNetwork) { if (IPAddress.IsLoopback(addrInf.Address)) { continue; } System.Console.WriteLine(addrInf.Address.ToString()); } } } } } }
この処理を元に、System.Console.WriteLineの箇所でList
ジェズイットを見習え |
ちょっと実験してみましたら、Dns.GetHostEntry(SystemInformation.ComputerName).AddressListで、自IPアドレスは全部帰ってきしたけれど、とれない場合もあるんですか?
取れる場合との違いを調べてみたら、hostsへの書き込みがあれば、その情報のみを利用することが原因ですね(元の環境は自ホスト名をすべてループバックに設定している)。アダプタから取るとhostsを見もしないので常にインターフェイス設定が読めるということみたいです。