Disponibilità di rete
Lo spazio dei nomi System.Net.NetworkInformation consente di raccogliere informazioni sugli eventi, le modifiche, le statistiche e le proprietà della rete. In questo articolo si apprenderà come usare la classe System.Net.NetworkInformation.NetworkChange per determinare se l'indirizzo di rete o la disponibilità sono cambiati. Inoltre, verranno visualizzate le statistiche e le proprietà della rete in base a un'interfaccia o a un protocollo. Infine, verrà usata la classe System.Net.NetworkInformation.Ping per determinare se un host remoto è raggiungibile.
Eventi di modifica della rete
La classe System.Net.NetworkInformation.NetworkChange consente di determinare se l'indirizzo di rete o la disponibilità sono cambiati. Per usare questa classe, creare un gestore eventi per elaborare la modifica e associarlo a un NetworkAddressChangedEventHandler o 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;
Il codice C# precedente:
- Registra un gestore eventi per l'evento NetworkChange.NetworkAvailabilityChanged.
- Il gestore eventi scrive semplicemente lo stato di disponibilità nella console.
- Viene scritto un messaggio nella console per informare l'utente che il codice è in ascolto delle modifiche nella disponibilità di rete e attende che venga premuto un tasto per uscire.
- Annulla la registrazione del gestore eventi.
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;
Il codice C# precedente:
- Registra un gestore eventi per l'evento NetworkChange.NetworkAddressChanged.
- Il gestore eventi esegue l'iterazione su NetworkInterface.GetAllNetworkInterfaces(), scrivendo il nome e lo stato operativo nella console.
- Viene scritto un messaggio nella console per informare l'utente che il codice è in ascolto delle modifiche nella disponibilità di rete e attende che venga premuto un tasto per uscire.
- Annulla la registrazione del gestore eventi.
Statistiche e proprietà di rete
È possibile raccogliere le statistiche e le proprietà della rete in base a un'interfaccia o a un protocollo. Le classi NetworkInterface, NetworkInterfaceType e PhysicalAddress forniscono informazioni su una particolare interfaccia di rete, mentre le classi IPInterfaceProperties, IPGlobalProperties, IPGlobalStatistics, TcpStatistics e UdpStatistics offrono informazioni sui pacchetti del livello 3 e 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();
}
Il codice C# precedente:
- Chiama un metodo personalizzato
ShowStatistics
per visualizzare le statistiche per ogni protocollo. - Il metodo
ShowStatistics
chiama IPGlobalProperties.GetIPGlobalProperties() e, a seconda dell'oggetto specificato NetworkInterfaceComponent, chiamerà IPGlobalProperties.GetIPv4GlobalStatistics() o IPGlobalProperties.GetIPv6GlobalStatistics(). - L'oggetto TcpStatistics viene scritto nella console.
Determinare se un host remoto è raggiungibile
È possibile usare la classe Ping per determinare se un host remoto è attivo, in rete e raggiungibile.
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();
}
Il codice C# precedente:
- Creare un oggetto Ping.
- Chiama Ping.SendPingAsync(String) con il parametro nome host
"stackoverflow.com"
. - Lo stato del ping viene scritto nella console.