| 著作一覧 |
なんとなく、.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を見もしないので常にインターフェイス設定が読めるということみたいです。