トップ «前の日記(2011-01-05) 最新 次の日記(2011-01-08)» 編集

日々の破片

著作一覧

2011-01-07

_ NET Frameworkで自ホストのIPアドレスを取得する

なんとなく、.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に入れて返すメソッドにしたり、さらに仮想アダプタを外したりする(IPAddressのマスクやGatewaryのアドレスをチェックする)。

本日のツッコミ(全2件) [ツッコミを入れる]
_ jzkey (2011-01-10 17:45)

ちょっと実験してみましたら、Dns.GetHostEntry(SystemInformation.ComputerName).AddressListで、自IPアドレスは全部帰ってきしたけれど、とれない場合もあるんですか?

_ arton (2011-01-11 00:15)

取れる場合との違いを調べてみたら、hostsへの書き込みがあれば、その情報のみを利用することが原因ですね(元の環境は自ホスト名をすべてループバックに設定している)。アダプタから取るとhostsを見もしないので常にインターフェイス設定が読めるということみたいです。


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|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

ジェズイットを見習え