【C#.NET解説】ネットワーク状態を監視するNetworkChangeクラスの使い方

2024年12月12日木曜日

ネットワーク

t f B! P L

名前空間 System.Net.NetworkInformation

NetworkChange

自己紹介

皆さま、こんにちは。私は風を読み、変化を告げる者。「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;
            }
        }
    }
}

このブログを検索

QooQ