利用しました。
しかし、クエリの発行やインデクサに対して名前を指定するなど、
全てのデバイス情報にアクセスできる分、プログラムが容易ではありませんでした。
そこで、今回はネットワークのみを扱うクラスを用いたいと思います。
と言っても、難しいものではないので早速ソースを見てみましょう。
(プロジェクトは前回同様"コンソール アプリケーション"で結構です。)
まず、名前空間の修飾省略定義を記述します。
ソースコード中に多く出てくる名前空間はここで省略して書いてしまいます。
/*** 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 件のコメント:
コメントを投稿