Bagikan melalui


Ketersediaan jaringan

Namespace System.Net.NetworkInformation memungkinkan Anda mengumpulkan informasi tentang peristiwa jaringan, perubahan, statistik, dan properti. Dalam artikel ini, Anda akan mempelajari cara menggunakan System.Net.NetworkInformation.NetworkChange kelas untuk menentukan apakah alamat jaringan atau ketersediaan telah berubah. Selain itu, Anda akan melihat statistik dan properti jaringan berdasarkan antarmuka atau protokol. Terakhir, Anda akan menggunakan System.Net.NetworkInformation.Ping kelas untuk menentukan apakah host jarak jauh dapat dijangkau.

Peristiwa perubahan jaringan

Kelas ini System.Net.NetworkInformation.NetworkChange memungkinkan Anda menentukan apakah alamat jaringan atau ketersediaan telah berubah. Untuk menggunakan kelas ini, buat penanganan aktivitas untuk memproses perubahan, dan kaitkan dengan NetworkAddressChangedEventHandler atau 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;

Kode C# sebelumnya:

  • Mendaftarkan penanganan aktivitas untuk peristiwa tersebut NetworkChange.NetworkAvailabilityChanged .
  • Penanganan aktivitas hanya menulis status ketersediaan ke konsol.
  • Pesan ditampilkan di konsol untuk memberi tahu pengguna bahwa kode sedang memantau perubahan ketersediaan jaringan dan menunggu pengguna menekan tombol untuk keluar.
  • Membatalkan pendaftaran penanganan aktivitas.
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;

Kode C# sebelumnya:

  • Mendaftarkan penanganan aktivitas untuk peristiwa tersebut NetworkChange.NetworkAddressChanged .
  • Handler event melakukan iterasi melalui NetworkInterface.GetAllNetworkInterfaces(), menulis nama dan status operasional mereka ke konsol.
  • Pesan ditampilkan di konsol untuk memberi tahu pengguna bahwa kode sedang memantau perubahan ketersediaan jaringan dan menunggu pengguna menekan tombol untuk keluar.
  • Membatalkan pendaftaran penanganan aktivitas.

Statistik dan properti jaringan

Anda dapat mengumpulkan statistik dan properti jaringan berdasarkan antarmuka atau protokol. Kelas NetworkInterface, , NetworkInterfaceTypedan PhysicalAddress memberikan informasi tentang antarmuka jaringan tertentu, sementara IPInterfacePropertieskelas , , IPGlobalPropertiesIPGlobalStatistics, TcpStatistics, dan UdpStatistics memberikan informasi tentang paket lapisan 3 dan lapisan 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();
}

Kode C# sebelumnya:

Menentukan apakah host jarak jauh dapat dijangkau

Anda dapat menggunakan Ping kelas untuk menentukan apakah host jarak jauh aktif, di jaringan, dan dapat dijangkau.

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();
}

Kode C# sebelumnya:

Lihat juga