Доступность сети

Пространство имен System.Net.NetworkInformation содержит классы для программного сбора информации о событиях, изменениях, статистике и свойствах сети. В этой статье вы узнаете, как использовать System.Net.NetworkInformation.NetworkChange класс, чтобы определить, изменился ли сетевой адрес или доступность. Кроме того, вы увидите сведения о статистике сети и свойствах на основе интерфейса или протокола. Наконец, вы будете использовать System.Net.NetworkInformation.Ping класс, чтобы определить, доступен ли удаленный узел.

События изменения сети

Класс System.Net.NetworkInformation.NetworkChange позволяет определить, изменились ли адрес или состояние доступности сети. Чтобы использовать этот класс, создайте обработчик событий для обработки этого изменения и свяжите его с NetworkAddressChangedEventHandler или 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;

В приведенном выше коде C#:

  • Регистрирует обработчик событий для NetworkChange.NetworkAvailabilityChanged события.
  • Обработчик событий просто записывает состояние доступности в консоль.
  • Сообщение записывается в консоль, позволяя пользователю знать, что код прослушивает изменения в доступности сети и ожидает завершения нажатия клавиши.
  • Отменяет регистрацию обработчика событий.
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;

В приведенном выше коде C#:

  • Регистрирует обработчик событий для NetworkChange.NetworkAddressChanged события.
  • Обработчик событий выполняет итерацию NetworkInterface.GetAllNetworkInterfaces(), записывая имя и состояние эксплуатации в консоль.
  • Сообщение записывается в консоль, позволяя пользователю знать, что код прослушивает изменения в доступности сети и ожидает завершения нажатия клавиши.
  • Отменяет регистрацию обработчика событий.

Статистика сети и свойства

Вы можете собирать статистику сетевой активности и сведения о свойствах на основе интерфейса или протокола. Классы NetworkInterface, NetworkInterfaceType и PhysicalAddress предоставляют информацию о конкретном сетевом интерфейсе, а классы IPInterfaceProperties, IPGlobalProperties, IPGlobalStatistics, TcpStatistics и UdpStatistics — информацию о пакетах уровня 3 и 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();
}

В приведенном выше коде C#:

Определение доступности удаленного узла

Класс можно использовать Ping для определения того, находится ли удаленный узел в сети и доступен.

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

В приведенном выше коде C#:

  • Создадите экземпляр объекта Ping.
  • Вызовы Ping.SendPingAsync(String) с параметром "stackoverflow.com" имени узла.
  • Состояние ping записывается в консоль.

См. также