Disponibilidade da rede
O System.Net.NetworkInformation namespace permite que você reúna informações sobre eventos de rede, alterações, estatísticas e propriedades. Neste artigo, você aprenderá como usar a System.Net.NetworkInformation.NetworkChange classe para determinar se o endereço de rede ou a disponibilidade foram alterados. Além disso, você verá sobre as estatísticas e propriedades da rede em uma interface ou protocolo. Finalmente, você usará a System.Net.NetworkInformation.Ping classe para determinar se um host remoto está acessível.
Eventos de alteração de rede
A System.Net.NetworkInformation.NetworkChange classe permite determinar se o endereço de rede ou a disponibilidade foram alterados. Para usar essa classe, crie um manipulador de eventos para processar a alteração e associe-a a um NetworkAddressChangedEventHandler ou a .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;
O código C# anterior:
- Registra um manipulador de eventos para o NetworkChange.NetworkAvailabilityChanged evento.
- O manipulador de eventos simplesmente grava o status de disponibilidade no console.
- Uma mensagem é gravada no console informando ao usuário que o código está escutando alterações na disponibilidade da rede e aguarda que uma tecla pressionada saia.
- Cancela o registro do manipulador 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;
O código C# anterior:
- Registra um manipulador de eventos para o NetworkChange.NetworkAddressChanged evento.
- O manipulador de eventos itera , NetworkInterface.GetAllNetworkInterfaces()escrevendo seu nome e status operacional no console.
- Uma mensagem é gravada no console informando ao usuário que o código está escutando alterações na disponibilidade da rede e aguarda que uma tecla pressionada saia.
- Cancela o registro do manipulador de eventos.
Estatísticas e propriedades da rede
Você pode reunir estatísticas e propriedades de rede em uma interface ou protocolo. As NetworkInterfaceclasses , NetworkInterfaceType, e PhysicalAddress fornecem informações sobre uma interface de rede específica, enquanto as IPInterfacePropertiesclasses , IPGlobalProperties, IPGlobalStatistics, TcpStatistics, e fornecem UdpStatistics informações sobre pacotes de camada 3 e camada 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();
}
O código C# anterior:
- Chama um método personalizado
ShowStatistics
para exibir as estatísticas de cada protocolo. - O
ShowStatistics
método chama IPGlobalProperties.GetIPGlobalProperties(), e dependendo do dado NetworkInterfaceComponent irá chamar IPGlobalProperties.GetIPv4GlobalStatistics() ou IPGlobalProperties.GetIPv6GlobalStatistics(). - Os TcpStatistics são gravados no console.
Determinar se um host remoto está acessível
Você pode usar a Ping classe para determinar se um host remoto está ativo, na rede e acessível.
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();
}
O código C# anterior:
- Instanciar um Ping objeto.
- Chamadas Ping.SendPingAsync(String) com o
"stackoverflow.com"
parâmetro hostname. - O status do ping é gravado no console.