Dostępność sieci

System.Net.NetworkInformation Przestrzeń nazw umożliwia zbieranie informacji o zdarzeniach sieciowych, zmianach, statystykach i właściwościach. W tym artykule dowiesz się, jak za pomocą System.Net.NetworkInformation.NetworkChange klasy określić, czy adres sieciowy czy dostępność uległa zmianie. Ponadto zobaczysz informacje o statystykach sieci i właściwościach interfejsu lub protokołu. Na koniec użyjesz System.Net.NetworkInformation.Ping klasy , aby określić, czy host zdalny jest osiągalny.

Zdarzenia zmiany sieci

Klasa System.Net.NetworkInformation.NetworkChange umożliwia określenie, czy adres sieciowy lub dostępność uległ zmianie. Aby użyć tej klasy, utwórz procedurę obsługi zdarzeń w celu przetworzenia zmiany i skojarz ją z elementem NetworkAddressChangedEventHandlerNetworkAvailabilityChangedEventHandlerlub .

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;

Poprzedni kod języka C#:

  • Rejestruje program obsługi zdarzeń dla NetworkChange.NetworkAvailabilityChanged zdarzenia.
  • Procedura obsługi zdarzeń po prostu zapisuje stan dostępności w konsoli programu .
  • Komunikat jest zapisywany w konsoli, aby poinformować użytkownika, że kod nasłuchuje zmian dostępności sieci i czeka na zakończenie naciśnięcia klawisza.
  • Wyrejestrowuje procedurę obsługi zdarzeń.
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;

Poprzedni kod języka C#:

  • Rejestruje program obsługi zdarzeń dla NetworkChange.NetworkAddressChanged zdarzenia.
  • Program obsługi zdarzeń iteruje NetworkInterface.GetAllNetworkInterfaces()wartość , zapisuj ich nazwę i stan operacyjny w konsoli programu .
  • Komunikat jest zapisywany w konsoli, aby poinformować użytkownika, że kod nasłuchuje zmian dostępności sieci i czeka na zakończenie naciśnięcia klawisza.
  • Wyrejestrowuje procedurę obsługi zdarzeń.

Statystyki i właściwości sieci

Statystyki i właściwości sieci można zbierać na podstawie interfejsu lub protokołu. Klasy NetworkInterface, NetworkInterfaceTypei PhysicalAddress zapewniają informacje o określonym interfejsie sieciowym, podczas gdy IPInterfacePropertiesklasy , IPGlobalProperties, IPGlobalStatistics, TcpStatisticsi UdpStatistics zapewniają informacje o pakietach warstwy 3 i 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();
}

Poprzedni kod języka C#:

Określanie, czy host zdalny jest osiągalny

Możesz użyć Ping klasy , aby określić, czy host zdalny jest włączony, w sieci i osiągalny.

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();
}

Poprzedni kod języka C#:

  • Utwórz wystąpienie Ping obiektu.
  • Wywołania Ping.SendPingAsync(String) za pomocą parametru "stackoverflow.com" nazwa hosta.
  • Stan polecenia ping jest zapisywany w konsoli programu .

Zobacz też