Disponibilidade da rede
O namespace System.Net.NetworkInformation permite que você colete informações sobre eventos, alterações, estatísticas e propriedades de rede. Neste artigo, você aprenderá a usar a classe System.Net.NetworkInformation.NetworkChange para determinar se o endereço de rede ou a disponibilidade foram alterados. Além disso, você verá informações sobre as estatísticas de rede e as propriedades com base na interface ou no protocolo. Por fim, você usará a classe System.Net.NetworkInformation.Ping para determinar se um host remoto pode ser acessado.
Eventos de alteração de rede
A classe System.Net.NetworkInformation.NetworkChange permite que você determine se o endereço de rede ou a disponibilidade foi alterada. Para usar essa classe, crie um manipulador de eventos para processar a alteração e associe-o a um NetworkAddressChangedEventHandler ou 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 anterior do C#:
- Registra um manipulador de eventos para o evento NetworkChange.NetworkAvailabilityChanged.
- O manipulador de eventos apenas 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 um pressionamento de tecla para sair.
- 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 anterior do C#:
- Registra um manipulador de eventos para o evento NetworkChange.NetworkAddressChanged.
- O manipulador de eventos itera em NetworkInterface.GetAllNetworkInterfaces(), gravando seu nome e o 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 um pressionamento de tecla para sair.
- Cancela o registro do manipulador de eventos.
Propriedades e estatísticas de rede
Você pode coletar estatísticas de rede e propriedades por protocolo ou por interface. As classes NetworkInterface, NetworkInterfaceType e PhysicalAddress fornecem informações sobre um adaptador de rede específico, enquanto as classes IPInterfaceProperties, IPGlobalProperties, IPGlobalStatistics, TcpStatistics e UdpStatistics fornecem informações sobre os pacotes de camada 3 e de 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 anterior do C#:
- Chama um método
ShowStatistics
personalizado para exibir as estatísticas de cada protocolo. - O método
ShowStatistics
chama IPGlobalProperties.GetIPGlobalProperties() e, dependendo do NetworkInterfaceComponent determinado, chama IPGlobalProperties.GetIPv4GlobalStatistics() ou IPGlobalProperties.GetIPv6GlobalStatistics(). - Os TcpStatistics são gravados no console.
Determinar se um host remoto é alcançável
Você pode usar a classe Ping para determinar se um host remoto está funcionando, se está na rede e se pode ser acessado.
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 anterior do C#:
- Instancie um objeto Ping.
- Chama Ping.SendPingAsync(String) com o parâmetro de hostname
"stackoverflow.com"
. - O status do ping é gravado no console.