2008年1月28日月曜日

IPアドレスやMACアドレスを取得する(C#) その2

前回の記事ではWMIインスタンスである"ManagementObject"を
利用しました。

しかし、クエリの発行やインデクサに対して名前を指定するなど、
全てのデバイス情報にアクセスできる分、プログラムが容易ではありませんでした。

そこで、今回はネットワークのみを扱うクラスを用いたいと思います。

と言っても、難しいものではないので早速ソースを見てみましょう。
(プロジェクトは前回同様"コンソール アプリケーション"で結構です。)


まず、名前空間の修飾省略定義を記述します。

ソースコード中に多く出てくる名前空間はここで省略して書いてしまいます。

/*** Program.cs ***/
using System.Net;
using System.Net.NetworkInformation;

名前空間の省略は、記述した空間内の、クラスにのみ適用されます。

つまり、"System.Net"名前空間の省略を宣言しても、"NetworkInformation"
名前空間の前が省略されるようになるわけではありません。

"using System.Net"のみの宣言を行った場合は、
例えば"System.Net.NetworkInformation.GetIsNetworkAvailable()"
のように、頭から全て記述しなければなりません。

/*** Program.cs ***/
static void Main(string[] args)
{
// ネットワークが利用できない場合は終了する
if (!NetworkInterface.GetIsNetworkAvailable())
return;

// 各ネットワークインタフェース毎に処理を行っていく
NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in adapters)
{
if (adapter.OperationalStatus.Equals(OperationalStatus.Up))
{
IPInterfaceProperties properties = adapter.GetIPProperties();
foreach (IPAddressInformation ipInfo in properties.UnicastAddresses)
{
IPAddress ip = ipInfo.Address;
if (!IPAddress.IsLoopback(ip))
{
Console.WriteLine("IP = " + ip);
Console.WriteLine("MAC = " + adapter.GetPhysicalAddress());
}
}
}
}
System.Threading.Thread.Sleep(5000);
}

実行します。















ネットワークの状態は前回と同じです。

今回は、"OpenVPN"ネットワークに関する情報が表示されていません。

これは、ソース中の"adapter.OperationalStatus"で
"OperationalStatus.Up"と「ネットワークインタフェースが
正常に稼働している」ものに限定したためです。

この方が、より正確に現在利用しているネットワークインタフェースの情報を
取得できます。

0 件のコメント: