名前空間 System.Net.NetworkInformation
自己紹介
皆さま、こんにちは。私は風を読み、変化を告げる者。「NetworkChange」クラスは、ネットワークの状態変化を検知し、それを通知する役割を担っています。このクラスを使うと、プログラム内でネットワークの接続状況やIPアドレスの変更をリアルタイムに把握できます。例えば、Wi-Fiの切断や有線LANへの切り替えなどを即座に感知するのに便利です。
基本機能
このクラスの基本機能は、ネットワークアドレスの変更を検知することです。「NetworkAddressChangedEventHandler」を使って、IPアドレスの変更を簡単に監視するコードを以下に示します。
C#
using System;
using System.Net.NetworkInformation;
using System.Linq;
class Program
{
static void Main(string[] args)
{
NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(AddressChangedCallback);
Console.WriteLine("Listening for address changes. Press any key to exit.");
Console.ReadLine(); // ユーザー入力を待つことでアプリケーションの終了を防ぐ
}
static void AddressChangedCallback(object sender, EventArgs e)
{
var adapters = NetworkInterface.GetAllNetworkInterfaces();
Console.WriteLine($"IPアドレスが変更された");
}
}
ネットワークの利用の可否
「NetworkChange」クラスにはさまざまなイベントハンドラーを登録する機能があります。以下は、イベントを活用してネットワークの利用可能性を記録する方法を示します。
C#
using System;
using System.Net.NetworkInformation;
class Program
{
static void Main(string[] args)
{
// NetworkAvailabilityChangedイベントにハンドラーを追加
NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkAvailabilityChangedCallback);
Console.WriteLine("Listening for network availability changes. Press any key to exit.");
Console.ReadLine(); // ユーザー入力を待つことでアプリケーションの終了を防ぐ
}
static void NetworkAvailabilityChangedCallback(object? sender, NetworkAvailabilityEventArgs e)
{
if (e.IsAvailable)
{
Console.WriteLine("ネットワークが利用可能になりました。");
}
else
{
Console.WriteLine("ネットワークが利用できなくなりました。");
}
}
}
変更されたアダプタを表示し変更前後のIPを取得する
最後に、変更されたネットワークアダプタ名とそのIPアドレスを表示するサンプルコードを示します。
C#
using System;
using System.Collections.Generic;
using System.Net.NetworkInformation;
using System.Linq;
class Program
{
private static Dictionary<string, List<string>> previousAddresses = new Dictionary<string, List<string>>();
static void Main(string[] args)
{
// 初期状態のIPアドレスを保存
SaveCurrentAddresses();
NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(AddressChangedCallback);
Console.WriteLine("Listening for address changes. Press any key to exit.");
Console.ReadLine(); // ユーザー入力を待つことでアプリケーションの終了を防ぐ
}
static void SaveCurrentAddresses()
{
var adapters = NetworkInterface.GetAllNetworkInterfaces();
foreach (var adapter in adapters)
{
var properties = adapter.GetIPProperties();
var unicastAddresses = properties.UnicastAddresses
.Where(address => address.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
.Select(address => address.Address.ToString())
.ToList();
previousAddresses[adapter.Name] = unicastAddresses;
}
}
static void AddressChangedCallback(object? sender, EventArgs e)
{
var adapters = NetworkInterface.GetAllNetworkInterfaces();
foreach (var adapter in adapters)
{
var properties = adapter.GetIPProperties();
var unicastAddresses = properties.UnicastAddresses
.Where(address => address.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
.Select(address => address.Address.ToString())
.ToList();
if (previousAddresses.ContainsKey(adapter.Name))
{
var previous = previousAddresses[adapter.Name];
if (!previous.SequenceEqual(unicastAddresses))
{
Console.WriteLine($"IPアドレスが変更されたアダプタ: {adapter.Name}");
previousAddresses[adapter.Name] = unicastAddresses; // 更新
}
}
else
{
previousAddresses[adapter.Name] = unicastAddresses;
}
}
}
}
0 件のコメント:
コメントを投稿