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:
- Llama a un método
ShowStatistics
personalizado para mostrar las estadísticas de cada protocolo. - El método
ShowStatistics
llama a IPGlobalProperties.GetIPGlobalProperties()y, en función del objeto NetworkInterfaceComponent especificado, llamará a IPGlobalProperties.GetIPv4GlobalStatistics() o a IPGlobalProperties.GetIPv6GlobalStatistics(). - TcpStatistics se escribe en la consola.
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.