Поделиться через


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

Пространство 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 записывается в консоль.

См. также