Beschikbaarheid van netwerk

Met de System.Net.NetworkInformation naamruimte kunt u informatie verzamelen over netwerk gebeurtenissen, wijzigingen, statistieken en eigenschappen. In dit artikel leert u hoe u de System.Net.NetworkInformation.NetworkChange klasse gebruikt om te bepalen of het netwerkadres of de beschikbaarheid is gewijzigd. Daarnaast ziet u informatie over de netwerkstatistieken en -eigenschappen op basis van een interface of protocol. Ten slotte gebruikt u de System.Net.NetworkInformation.Ping klasse om te bepalen of een externe host bereikbaar is.

Gebeurtenissen voor netwerkwijziging

Met de System.Net.NetworkInformation.NetworkChange klasse kunt u bepalen of het netwerkadres of de beschikbaarheid is gewijzigd. Als u deze klasse wilt gebruiken, maakt u een gebeurtenis-handler om de wijziging te verwerken en koppelt u deze aan een NetworkAddressChangedEventHandler of a 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;

De voorgaande C#-code:

  • Registreert een gebeurtenis-handler voor de NetworkChange.NetworkAvailabilityChanged gebeurtenis.
  • De gebeurtenishandler schrijft gewoon de beschikbaarheidsstatus naar de console.
  • Er wordt een bericht naar de console geschreven, om de gebruiker te laten weten dat de code luistert naar wijzigingen in de beschikbaarheid van het netwerk en wacht tot er op een toets wordt gedrukt om af te sluiten.
  • Uitschrijven van de eventhandler.
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;

De voorgaande C#-code:

  • Registreert een gebeurtenis-handler voor de NetworkChange.NetworkAddressChanged gebeurtenis.
  • De event handler doorloopt NetworkInterface.GetAllNetworkInterfaces(), en schrijft hun naam en operationele status op de console.
  • Er wordt een bericht naar de console geschreven, om de gebruiker te laten weten dat de code luistert naar wijzigingen in de beschikbaarheid van het netwerk en wacht tot er op een toets wordt gedrukt om af te sluiten.
  • Uitschrijven van de eventhandler.

Netwerkstatistieken en -eigenschappen

U kunt netwerkstatistieken en -eigenschappen verzamelen op basis van een interface of protocol. De NetworkInterface, NetworkInterfaceTypeen PhysicalAddress klassen geven informatie over een bepaalde netwerkinterface, terwijl de IPInterfaceProperties, IPGlobalPropertiesIPGlobalStatistics, en TcpStatisticsUdpStatistics klassen informatie geven over laag 3- en laag 4-pakketten.

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

De voorgaande C#-code:

Bepalen of een externe host bereikbaar is

U kunt de Ping klasse gebruiken om te bepalen of een externe host op, in het netwerk en bereikbaar is.

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

De voorgaande C#-code:

  • Instantieer een Ping object.
  • Roept Ping.SendPingAsync(String) aan met de parameter "stackoverflow.com" hostnaam.
  • De status van de ping wordt naar de console geschreven.

Zie ook