Disponibilidad de la red

El espacio de nombres System.Net.NetworkInformation permite recopilar información sobre eventos, cambios, estadísticas y propiedades de red. En este artículo, aprenderá a usar la clase System.Net.NetworkInformation.NetworkChange para saber si la disponibilidad o la dirección de red han cambiado. Además, obtendrá información sobre las estadísticas y propiedades de red de una interfaz o un protocolo. Por último, usará la clase System.Net.NetworkInformation.Ping para saber si se puede acceder a un host remoto.

Eventos de cambio de red

La clase System.Net.NetworkInformation.NetworkChange permite determinar si se ha cambiado la dirección de red o la disponibilidad. Para usar esta clase, cree un controlador de eventos para procesar el cambio y asócielo con un NetworkAddressChangedEventHandler o un 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;

El código de C# anterior:

  • Registra un controlador de eventos para el evento NetworkChange.NetworkAvailabilityChanged.
  • El controlador de eventos simplemente escribe el estado de disponibilidad en la consola.
  • Se escribe un mensaje en la consola para que el usuario sepa que el código está escuchando los cambios en la disponibilidad de red y está a la espera de que se presione una tecla para cerrarse.
  • Anula el registro del controlador de eventos.
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;

El código de C# anterior:

  • Registra un controlador de eventos para el evento NetworkChange.NetworkAddressChanged.
  • El controlador de eventos itera por NetworkInterface.GetAllNetworkInterfaces(), y escribe su nombre y estado operativo en la consola.
  • Se escribe un mensaje en la consola para que el usuario sepa que el código está escuchando los cambios en la disponibilidad de red y está a la espera de que se presione una tecla para cerrarse.
  • Anula el registro del controlador de eventos.

Estadísticas y propiedades de red

Puede recopilar estadísticas y propiedades de red por interfaz o protocolo. Las clases NetworkInterface, NetworkInterfaceType y PhysicalAddress ofrecen información sobre una interfaz de red determinada, mientras que las clases IPInterfaceProperties, IPGlobalProperties, IPGlobalStatistics, TcpStatistics y UdpStatistics proporcionan información sobre los paquetes de la capa 3 y la capa 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();
}

El código de C# anterior:

Saber si un host remoto es accesible

Puede usar la clase Ping para saber si un host remoto está funcionando en la red y es accesible.

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

El código de C# anterior:

  • Cree una instancia de un objeto Ping.
  • Llama a Ping.SendPingAsync(String) con el parámetro de nombre de host "stackoverflow.com".
  • El estado del ping se escribe en la consola.

Vea también