Dostupnost sítě

Obor System.Net.NetworkInformation názvů umožňuje shromažďovat informace o síťových událostech, změnách, statistikách a vlastnostech. V tomto článku se dozvíte, jak pomocí System.Net.NetworkInformation.NetworkChange třídy zjistit, jestli se změnila síťová adresa nebo dostupnost. Kromě toho se dozvíte o statistikách sítě a vlastnostech na základě rozhraní nebo protokolu. Nakonec pomocí System.Net.NetworkInformation.Ping třídy určíte, jestli je vzdálený hostitel dostupný.

Události změny sítě

Třída System.Net.NetworkInformation.NetworkChange umožňuje určit, jestli se změnila síťová adresa nebo dostupnost. Chcete-li použít tuto třídu, vytvořte obslužnou rutinu události pro zpracování změny a přidružte ji k NetworkAddressChangedEventHandler nebo 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;

Předchozí kód jazyka C#:

  • Zaregistruje obslužnou rutinu NetworkChange.NetworkAvailabilityChanged události pro událost.
  • Obslužná rutina události jednoduše zapíše stav dostupnosti do konzoly.
  • Do konzoly se zapíše zpráva s informacemi o tom, že kód naslouchá změnám v dostupnosti sítě a čeká na ukončení klávesy.
  • Zruší registraci obslužné rutiny události.
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;

Předchozí kód jazyka C#:

  • Zaregistruje obslužnou rutinu NetworkChange.NetworkAddressChanged události pro událost.
  • Obslužná rutina události iteruje NetworkInterface.GetAllNetworkInterfaces(), zapíše jejich název a provozní stav do konzoly.
  • Do konzoly se zapíše zpráva s informacemi o tom, že kód naslouchá změnám v dostupnosti sítě a čeká na ukončení klávesy.
  • Zruší registraci obslužné rutiny události.

Statistika a vlastnosti sítě

Statistiky a vlastnosti sítě můžete shromažďovat na základě rozhraní nebo protokolu. Třídy NetworkInterfacea PhysicalAddress , NetworkInterfaceTypeposkytují informace o určitém síťovém rozhraní, zatímco IPInterfaceProperties, IPGlobalProperties, IPGlobalStatistics, TcpStatisticsa UdpStatistics třídy poskytují informace o vrstvě 3 a vrstvy 4 pakety.

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

Předchozí kód jazyka C#:

Určení, jestli je vzdálený hostitel dostupný

Třídu můžete použít Ping k určení, jestli je vzdálený hostitel v provozu, v síti a dosažitelný.

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

Předchozí kód jazyka C#:

  • Vytvoření instance objektu Ping
  • Volání Ping.SendPingAsync(String) s parametrem "stackoverflow.com" hostname.
  • Stav příkazu ping se zapíše do konzoly.

Viz také