네임스페이 System.Net.NetworkInformation 스를 사용하면 네트워크 이벤트, 변경 내용, 통계 및 속성에 대한 정보를 수집할 수 있습니다. 이 문서에서는 클래스를 사용하여 System.Net.NetworkInformation.NetworkChange 네트워크 주소 또는 가용성이 변경되었는지 여부를 확인하는 방법을 알아봅니다. 또한 인터페이스 또는 프로토콜 기준으로 네트워크 통계 및 속성에 대해 알아봅니다. 마지막으로, 클래스를 System.Net.NetworkInformation.Ping 사용하여 원격 호스트에 연결할 수 있는지 여부를 확인합니다.
네트워크 변경 이벤트
이 System.Net.NetworkInformation.NetworkChange 클래스를 사용하면 네트워크 주소 또는 가용성이 변경되었는지 여부를 확인할 수 있습니다. 이 클래스를 사용하려면 변경 사항을 처리할 이벤트 처리기를 만들고 이를 a 또는 a NetworkAddressChangedEventHandlerNetworkAvailabilityChangedEventHandler와 연결합니다.
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 인스턴스화합니다.
- 호스트 이름 매개 변수를 사용하여 Ping.SendPingAsync(String)을
"stackoverflow.com"
로 호출합니다. - ping 상태가 콘솔에 기록됩니다.
참고하십시오
.NET