네트워크 사용 가능성

System.Net.NetworkInformation 네임스페이스를 사용하면 네트워크 이벤트, 변경 사항, 통계 및 속성에 대한 정보를 수집할 수 있습니다. 이 문서에서는 System.Net.NetworkInformation.NetworkChange 클래스를 사용하여 네트워크 주소 또는 가용성이 변경되었는지 확인하는 방법을 알아봅니다. 또한 인터페이스 또는 프로토콜 기준으로 네트워크 통계 및 속성에 대해 확인할 수 있습니다. 마지막으로 System.Net.NetworkInformation.Ping 클래스를 사용하여 원격 호스트에 연결할 수 있는지 여부를 확인합니다.

네트워크 변경 이벤트

System.Net.NetworkInformation.NetworkChange 클래스를 사용하면 네트워크 주소 또는 가용성이 변경되었는지 확인할 수 있습니다. 이 클래스를 사용하려면 이벤트 처리기를 만들어 변경 사항을 처리한 다음 NetworkAddressChangedEventHandler 또는 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;

위의 C# 코드에서:

  • NetworkChange.NetworkAvailabilityChanged 이벤트에 대한 이벤트 처리기를 등록합니다.
  • 이벤트 처리기는 단순히 가용성 상태를 콘솔에 씁니다.
  • 코드가 네트워크 가용성의 변경 내용을 수신 대기하고 키 누름이 종료되기를 기다리는 것을 사용자에게 알리는 메시지가 콘솔에 기록됩니다.
  • 이벤트 처리기를 등록 취소합니다.
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;

위의 C# 코드에서:

  • NetworkChange.NetworkAddressChanged 이벤트에 대한 이벤트 처리기를 등록합니다.
  • 이벤트 처리기는 NetworkInterface.GetAllNetworkInterfaces()를 반복하여 그 이름 및 작동 상태를 콘솔에 기록합니다.
  • 코드가 네트워크 가용성의 변경 내용을 수신 대기하고 키 누름이 종료되기를 기다리는 것을 사용자에게 알리는 메시지가 콘솔에 기록됩니다.
  • 이벤트 처리기를 등록 취소합니다.

네트워크 통계 및 속성

인터페이스 또는 프로토콜을 기반으로 네트워크 통계 및 속성을 수집할 수 있습니다. NetworkInterface, NetworkInterfaceTypePhysicalAddress 클래스는 특정 네트워크 인터페이스에 대한 정보를 제공하는 반면 IPInterfaceProperties, IPGlobalProperties, IPGlobalStatistics, TcpStatisticsUdpStatistics 클래스는 계층 3 및 계층 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();
}

위의 C# 코드에서:

원격 호스트에 연결 가능한지 확인

Ping 클래스를 사용하여 원격 호스트가 가동되어 네트워크에 있으며 연결 가능한지 확인할 수 있습니다.

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

위의 C# 코드에서:

  • Ping 개체를 인스턴스화합니다.
  • "stackoverflow.com" 호스트 이름 매개 변수를 사용하여 Ping.SendPingAsync(String)을 호출합니다.
  • ping 상태가 콘솔에 기록됩니다.

추가 정보