네트워크 사용 가능성
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, NetworkInterfaceType 및 PhysicalAddress 클래스는 특정 네트워크 인터페이스에 대한 정보를 제공하는 반면 IPInterfaceProperties, IPGlobalProperties, IPGlobalStatistics, TcpStatistics 및 UdpStatistics 클래스는 계층 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# 코드에서:
- 사용자 지정
ShowStatistics
메서드를 호출하여 각 프로토콜에 대한 통계를 표시합니다. ShowStatistics
메서드는 IPGlobalProperties.GetIPGlobalProperties()를 호출하고 지정된 NetworkInterfaceComponent에 따라 IPGlobalProperties.GetIPv4GlobalStatistics() 또는 IPGlobalProperties.GetIPv6GlobalStatistics()를 호출합니다.- TcpStatistics는 콘솔에 기록됩니다.
원격 호스트에 연결 가능한지 확인
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 상태가 콘솔에 기록됩니다.
추가 정보
.NET