Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El System.Net.NetworkInformation espacio de nombres permite recopilar información sobre eventos de red, cambios, estadísticas y propiedades. En este artículo, aprenderá a usar la System.Net.NetworkInformation.NetworkChange clase para determinar si la dirección de red o la disponibilidad han cambiado. Además, podrá ver las estadísticas y propiedades de la red en función de una interfaz o protocolo. Por último, usará la System.Net.NetworkInformation.Ping clase para determinar si se puede acceder a un host remoto.
Eventos de cambio de red
La System.Net.NetworkInformation.NetworkChange clase permite determinar si la dirección de red o la disponibilidad han cambiado. 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 NetworkChange.NetworkAvailabilityChanged evento.
- El controlador de eventos simplemente escribe el estado de disponibilidad en la consola.
- Se escribe un mensaje en la consola para informar al usuario que el código está escuchando cambios en la disponibilidad de la red y espera a que se presione una tecla para salir.
- 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 NetworkChange.NetworkAddressChanged evento.
- 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 informar al usuario que el código está escuchando cambios en la disponibilidad de la red y espera a que se presione una tecla para salir.
- Anula el registro del controlador de eventos.
Estadísticas y propiedades de red
Puede recopilar estadísticas y propiedades de red en una interfaz o protocolo. Las NetworkInterfaceclases , NetworkInterfaceTypey PhysicalAddress proporcionan información sobre una interfaz de red determinada, mientras que las IPInterfacePropertiesclases , IPGlobalProperties, IPGlobalStatistics, TcpStatistics, y UdpStatistics proporcionan información sobre los paquetes de nivel 3 y 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 personalizado
ShowStatistics
para mostrar las estadísticas de cada protocolo. - El
ShowStatistics
método llama a IPGlobalProperties.GetIPGlobalProperties()y, en función de lo especificado NetworkInterfaceComponent , llamará a IPGlobalProperties.GetIPv4GlobalStatistics() o IPGlobalProperties.GetIPv6GlobalStatistics(). - TcpStatistics se escribe en la consola.
Determinar si se puede acceder a un host remoto
Puede usar la Ping clase para determinar si un host remoto está activado, en la red y 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:
- Instancie 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.