Bagikan melalui


Ketersediaan jaringan

Namespace System.Net.NetworkInformation memungkinkan Anda mengumpulkan informasi tentang kejadian, perubahan, statistik, dan properti jaringan. 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 System.Net.NetworkInformation.NetworkChange memungkinkan Anda menentukan jika alamat atau ketersediaan jaringan telah berubah. Untuk menggunakan kelas ini, buat pengatur kejadian untuk memproses perubahan lalu kaitkan perubahan tersebut 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 ditulis ke konsol yang memberi tahu pengguna bahwa kode mendengarkan perubahan ketersediaan jaringan dan menunggu penekanan tombol 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 .
  • Penanganan aktivitas melakukan iterasi melalui NetworkInterface.GetAllNetworkInterfaces(), menulis nama dan status operasional mereka ke konsol.
  • Pesan ditulis ke konsol yang memberi tahu pengguna bahwa kode mendengarkan perubahan ketersediaan jaringan dan menunggu penekanan tombol keluar.
  • Membatalkan pendaftaran penanganan aktivitas.

Statistik dan properti jaringan

Anda dapat mengumpulkan statistik dan properti jaringan berdasarkan antarmuka atau protokol. Kelas NetworkInterface, NetworkInterfaceType, dan PhysicalAddress memberikan informasi tentang antarmuka jaringan tertentu, sementara kelas IPInterfaceProperties, IPGlobalProperties, IPGlobalStatistics, TcpStatistics, dan UdpStatisticsmemberikan 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