답변:
다음을 사용하여 .NET 2.0에서 네트워크 연결을 확인할 수 있습니다 GetIsNetworkAvailable()
.
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
IP 주소의 변경 또는 네트워크 가용성의 변경을 모니터링하려면 NetworkChange 클래스 의 이벤트를 사용하십시오 .
System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
NetworkInterface.GetIsNetworkAvailable()
특히 가상 머신에서 실행할 때 내 응용 프로그램 (.NET 4.5, Windows 10)에서 매우 불안정했습니다. 의 이벤트 처리는 NetworkAvailabilityChanged
신뢰할 수 있습니다.
표시된 대답은 100 % 괜찮지 만 표준 방법이 가상 카드 (가상 상자, ...)에 속는 경우가 있습니다. 또한 속도 (직렬 포트, 모뎀 등)에 따라 일부 네트워크 인터페이스를 폐기하는 것이 바람직합니다.
다음은 이러한 경우를 확인하는 코드입니다.
/// <summary>
/// Indicates whether any network connection is available
/// Filter connections below a specified speed, as well as virtual network cards.
/// </summary>
/// <returns>
/// <c>true</c> if a network connection is available; otherwise, <c>false</c>.
/// </returns>
public static bool IsNetworkAvailable()
{
return IsNetworkAvailable(0);
}
/// <summary>
/// Indicates whether any network connection is available.
/// Filter connections below a specified speed, as well as virtual network cards.
/// </summary>
/// <param name="minimumSpeed">The minimum speed required. Passing 0 will not filter connection using speed.</param>
/// <returns>
/// <c>true</c> if a network connection is available; otherwise, <c>false</c>.
/// </returns>
public static bool IsNetworkAvailable(long minimumSpeed)
{
if (!NetworkInterface.GetIsNetworkAvailable())
return false;
foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
{
// discard because of standard reasons
if ((ni.OperationalStatus != OperationalStatus.Up) ||
(ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) ||
(ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel))
continue;
// this allow to filter modems, serial, etc.
// I use 10000000 as a minimum speed for most cases
if (ni.Speed < minimumSpeed)
continue;
// discard virtual cards (virtual box, virtual pc, etc.)
if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) ||
(ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0))
continue;
// discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card.
if (ni.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase))
continue;
return true;
}
return false;
}
Microsoft Windows Vista 및 7은 NCSI (Network Connectivity Status Indicator) 기술을 사용합니다.
네트워크 연결을 확인하려면이 메서드를 호출하십시오.
public static bool IsConnectedToInternet()
{
bool returnValue = false;
try
{
int Desc;
returnValue = Utility.InternetGetConnectedState(out Desc, 0);
}
catch
{
returnValue = false;
}
return returnValue;
}
이것을 코드 줄 아래에 넣으십시오.
[DllImport("wininet.dll")]
public extern static bool InternetGetConnectedState(out int Description, int ReservedValue);