Netzwerkverfügbarkeit

Mit dem Namespace System.Net.NetworkInformation können Sie Informationen über Netzwerkereignisse, Änderungen, Statistiken sowie Eigenschaften sammeln. In diesem Artikel erfahren Sie, wie Sie mithilfe der System.Net.NetworkInformation.NetworkChange-Klasse ermitteln, ob sich die Netzwerkadresse oder die Verfügbarkeit geändert hat. Darüber hinaus erfahren Sie mehr über die Netzwerkstatistiken und -eigenschaften auf Schnittstellen- oder Protokollbasis. Schließlich verwenden Sie die System.Net.NetworkInformation.Ping-Klasse, um zu bestimmen, ob ein Remotehost erreichbar ist.

Netzwerkänderungsereignisse

Mithilfe der System.Net.NetworkInformation.NetworkChange-Klasse können Sie bestimmen, ob sich die Netzwerkadresse oder die Verfügbarkeit geändert hat. Um diese Klasse verwenden zu können, erstellen Sie einen Ereignishandler, um die Änderung zu verarbeiten und um ihr einen NetworkAddressChangedEventHandler oder NetworkAvailabilityChangedEventHandler zuzuordnen.

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ür den C#-Code oben gilt:

  • Registriert einen Ereignishandler für das NetworkChange.NetworkAvailabilityChanged-Ereignis.
  • Der Ereignishandler schreibt einfach den Verfügbarkeitsstatus in die Konsole.
  • Es wird eine Nachricht in die Konsole geschrieben, die den Benutzer darüber informiert, dass der Code auf Änderungen der Netzwerkverfügbarkeit lauscht und auf ein Beenden durch Tastendruck wartet.
  • Hebt die Registrierung des Ereignishandlers auf.
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ür den C#-Code oben gilt:

  • Registriert einen Ereignishandler für das NetworkChange.NetworkAddressChanged-Ereignis.
  • Der Ereignishandler durchläuft NetworkInterface.GetAllNetworkInterfaces() und schreibt seinen Namen und Betriebsstatus in die Konsole.
  • Es wird eine Nachricht in die Konsole geschrieben, die den Benutzer darüber informiert, dass der Code auf Änderungen der Netzwerkverfügbarkeit lauscht und auf ein Beenden durch Tastendruck wartet.
  • Hebt die Registrierung des Ereignishandlers auf.

Netzwerkstatistiken und -eigenschaften

Sie können Netzwerkstatistiken und -eigenschaften auf einer Schnittstelle oder auf Protokollbasis sammeln. Die Klassen NetworkInterface, NetworkInterfaceType und PhysicalAddress halten Informationen über eine bestimmte Netzwerkschnittstelle bereit, während die Klassen IPInterfaceProperties, IPGlobalProperties, IPGlobalStatistics, TcpStatistics und UdpStatistics Informationen über Pakete der Ebene 3 und der Ebene 4 bereitstellen.

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ür den C#-Code oben gilt:

Bestimmen der Erreichbarkeit eines Remotehosts

Sie können die Ping-Klasse verwenden, um zu bestimmen, ob ein Remotehost verfügbar, im Netzwerk und erreichbar ist.

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ür den C#-Code oben gilt:

  • Instanziieren Sie ein Ping-Objekt.
  • Ruft Ping.SendPingAsync(String) mit dem Hostnamenparameter "stackoverflow.com" auf.
  • Der Status des Pingens wird in die Konsole geschrieben.

Weitere Informationen