Nätverkstillgänglighet

Med System.Net.NetworkInformation namnområdet kan du samla in information om nätverkshändelser, ändringar, statistik och egenskaper. I den här artikeln får du lära dig hur du använder System.Net.NetworkInformation.NetworkChange klassen för att avgöra om nätverksadressen eller tillgängligheten har ändrats. Dessutom får du information om nätverksstatistik och egenskaper på bas av gränssnitt eller protokoll. Slutligen kommer du att använda klassen System.Net.NetworkInformation.Ping för att avgöra om en fjärrvärd kan nås.

Händelser för nätverksändring

Med System.Net.NetworkInformation.NetworkChange klassen kan du avgöra om nätverksadressen eller tillgängligheten har ändrats. Om du vill använda den här klassen skapar du en händelsehanterare för att bearbeta ändringen och associerar den med en NetworkAddressChangedEventHandler eller en 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;

Föregående C#-kod:

  • Registrerar en händelsehanterare för NetworkChange.NetworkAvailabilityChanged händelsen.
  • Händelsehanteraren skriver bara tillgänglighetsstatusen till konsolen.
  • Ett meddelande skrivs till konsolen så att användaren vet att koden lyssnar efter ändringar i nätverkstillgängligheten och väntar på att en tangenttryckning ska avslutas.
  • Avregistrerar händelsehanteraren.
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;

Föregående C#-kod:

  • Registrerar en händelsehanterare för NetworkChange.NetworkAddressChanged händelsen.
  • Händelsehanteraren itererar över NetworkInterface.GetAllNetworkInterfaces()och skriver sitt namn och sin driftstatus till konsolen.
  • Ett meddelande skrivs till konsolen så att användaren vet att koden lyssnar efter ändringar i nätverkstillgängligheten och väntar på att en tangenttryckning ska avslutas.
  • Avregistrerar händelsehanteraren.

Nätverksstatistik och egenskaper

Du kan samla in nätverksstatistik och egenskaper på gränssnitts- eller protokollbasis. Klasserna NetworkInterface, , och NetworkInterfaceType ger information om ett visst nätverksgränssnitt, medan PhysicalAddressklasserna , IPInterfaceProperties, IPGlobalProperties, IPGlobalStatisticsoch TcpStatistics ger information om layer 3- och layer UdpStatistics4-paket.

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

Föregående C#-kod:

Kontrollera om en fjärrvärd kan nås

Du kan använda Ping klassen för att avgöra om en fjärrvärd är igång, i nätverket och kan nås.

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

Föregående C#-kod:

Se även