La disponibilité réseau

L’espace de noms System.Net.NetworkInformation permet de recueillir des informations concernant les événements, les modifications, les statistiques et les propriétés liés au réseau. Dans cet article, vous apprenez à utiliser la classe System.Net.NetworkInformation.NetworkChange pour déterminer si l’adresse réseau ou la disponibilité ont changé. Par ailleurs, vous voyez les statistiques et les propriétés du réseau en fonction de l’interface ou du protocole. Enfin, vous utilisez la classe System.Net.NetworkInformation.Ping pour déterminer si un hôte distant est accessible.

Événements de changement du réseau

La classe System.Net.NetworkInformation.NetworkChange permet de déterminer si l’adresse réseau ou la disponibilité du réseau ont changé. Pour utiliser cette classe, créez un gestionnaire d’événements en vue de traiter la modification, puis associez-la à un NetworkAddressChangedEventHandler ou un NetworkAvailabilityChangedEventHandler.

NetworkChange.NetworkAvailabilityChanged += OnNetworkAvailabilityChanged;

static void OnNetworkAvailabilityChanged(
    object? sender, NetworkAvailabilityEventArgs networkAvailability) =>
    Console.WriteLine($"Network is available: {networkAvailability.IsAvailable}");

Console.WriteLine(
    "Listening changes in network availability. Press any key to continue.");
Console.ReadLine();

NetworkChange.NetworkAvailabilityChanged -= OnNetworkAvailabilityChanged;

Le code C# précédent :

  • Inscrit un gestionnaire d'événements pour l’événement NetworkChange.NetworkAvailabilityChanged.
  • Le gestionnaire d’événements écrit simplement l’état de disponibilité dans la console.
  • Un message est écrit dans la console pour informer l’utilisateur que le code est à l’écoute des changements de disponibilité du réseau et attend qu’une touche soit enfoncée pour quitter.
  • Désinscrit le gestionnaire d’événements.
NetworkChange.NetworkAddressChanged += OnNetworkAddressChanged;

static void OnNetworkAddressChanged(
    object? sender, EventArgs args)
{
    foreach ((string name, OperationalStatus status) in
        NetworkInterface.GetAllNetworkInterfaces()
            .Select(networkInterface =>
                (networkInterface.Name, networkInterface.OperationalStatus)))
    {
        Console.WriteLine(
            $"{name} is {status}");
    }
}

Console.WriteLine(
    "Listening for address changes. Press any key to continue.");
Console.ReadLine();

NetworkChange.NetworkAddressChanged -= OnNetworkAddressChanged;

Le code C# précédent :

  • Inscrit un gestionnaire d'événements pour l’événement NetworkChange.NetworkAddressChanged.
  • Le gestionnaire d’événements fait une itération sur NetworkInterface.GetAllNetworkInterfaces(), en écrivant son nom et son état opérationnel dans la console.
  • Un message est écrit dans la console pour informer l’utilisateur que le code est à l’écoute des changements de disponibilité du réseau et attend qu’une touche soit enfoncée pour quitter.
  • Désinscrit le gestionnaire d’événements.

Statistiques et propriétés du réseau

Vous pouvez collecter des informations relatives aux statistiques et aux propriétés du réseau au niveau d’une interface ou d’un protocole. Les classes NetworkInterface, NetworkInterfaceType et PhysicalAddress fournissent des informations sur les interfaces réseau, alors que les classes IPInterfaceProperties, IPGlobalProperties, IPGlobalStatistics, TcpStatistics et UdpStatistics fournissent des informations sur les paquets des couches 3 et 4.

ShowStatistics(NetworkInterfaceComponent.IPv4);
ShowStatistics(NetworkInterfaceComponent.IPv6);

static void ShowStatistics(NetworkInterfaceComponent version)
{
    var properties = IPGlobalProperties.GetIPGlobalProperties();
    var stats = version switch
    {
        NetworkInterfaceComponent.IPv4 => properties.GetTcpIPv4Statistics(),
        _ => properties.GetTcpIPv6Statistics()
    };

    Console.WriteLine($"TCP/{version} Statistics");
    Console.WriteLine($"  Minimum Transmission Timeout : {stats.MinimumTransmissionTimeout:#,#}");
    Console.WriteLine($"  Maximum Transmission Timeout : {stats.MaximumTransmissionTimeout:#,#}");
    Console.WriteLine("  Connection Data");
    Console.WriteLine($"      Current :                  {stats.CurrentConnections:#,#}");
    Console.WriteLine($"      Cumulative :               {stats.CumulativeConnections:#,#}");
    Console.WriteLine($"      Initiated  :               {stats.ConnectionsInitiated:#,#}");
    Console.WriteLine($"      Accepted :                 {stats.ConnectionsAccepted:#,#}");
    Console.WriteLine($"      Failed Attempts :          {stats.FailedConnectionAttempts:#,#}");
    Console.WriteLine($"      Reset :                    {stats.ResetConnections:#,#}");
    Console.WriteLine("  Segment Data");
    Console.WriteLine($"      Received :                 {stats.SegmentsReceived:#,#}");
    Console.WriteLine($"      Sent :                     {stats.SegmentsSent:#,#}");
    Console.WriteLine($"      Retransmitted :            {stats.SegmentsResent:#,#}");
    Console.WriteLine();
}

Le code C# précédent :

Déterminer si un hôte distant est accessible

Vous pouvez utiliser la classe Ping pour déterminer si un hôte distant est disponible, s’il se trouve sur le réseau et s’il est accessible.

using Ping ping = new();

string hostName = "stackoverflow.com";
PingReply reply = await ping.SendPingAsync(hostName);
Console.WriteLine($"Ping status for ({hostName}): {reply.Status}");
if (reply is { Status: IPStatus.Success })
{
    Console.WriteLine($"Address: {reply.Address}");
    Console.WriteLine($"Roundtrip time: {reply.RoundtripTime}");
    Console.WriteLine($"Time to live: {reply.Options?.Ttl}");
    Console.WriteLine();
}

Le code C# précédent :

  • Instancier un objet Ping.
  • Appelle Ping.SendPingAsync(String) avec le paramètre de nom d’hôte "stackoverflow.com".
  • L’état du test ping est écrit dans la console.

Voir aussi