네트워크 연결을 어떻게 확인합니까?


답변:


153

다음을 사용하여 .NET 2.0에서 네트워크 연결을 확인할 수 있습니다 GetIsNetworkAvailable().

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

IP 주소의 변경 또는 네트워크 가용성의 변경을 모니터링하려면 NetworkChange 클래스 의 이벤트를 사용하십시오 .

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

9
이것이 "제한된 가용성"을 처리합니까?
tofutim 2011 년

이것은 WPF에서 항상 작동하지 않습니다. 일부 노트북은 false 일부 반환 true를 돌려
krilovich

정말 효과가 있나요? 이 줄을 작성하고 라우터를 끄고 여전히 true를 반환합니다!
Mushfiq

1
NetworkInterface.GetIsNetworkAvailable()특히 가상 머신에서 실행할 때 내 응용 프로그램 (.NET 4.5, Windows 10)에서 매우 불안정했습니다. 의 이벤트 처리는 NetworkAvailabilityChanged신뢰할 수 있습니다.
eskimwier

그것은 신뢰할 수 없습니다. 읽기 stackoverflow.com/a/25779403/2377343
T.Todua

174

표시된 대답은 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;
    }

17
이것은 정확하고 많은 찬성 할 가치가 있습니다. 수락 된 답변에 언급 된 NetworkAvailabilityChanged 이벤트가 안정적으로 실행되지 않았 음을 발견했습니다. 이는 아마도이 답변에서 언급 한 가상 어댑터로 인해 발생했을 것입니다
Marek

1
가상 머신에 대한 추가 검사는 +1입니다. 어제이 사건을 만났어요. 하지만 이름에 '가상'이 없기 때문에 'Hype-V'를 처리하지 못하는 것 같습니다.
Herdo

3
@Herdo-예, 코드는 완벽하지 않으며 가상 세계에는 완벽한 것이 있을 없다고 생각 합니다. 그러나 당신은 그것을 향상시킬 수 있습니다.
Simon Mourier 2014

@SimonMourier 당신이 맞습니다. 누군가가 여전히 참을 반환한다면, 연결이 없다면-> 이것은 문제 일 수 있습니다. :)
Herdo

1
@noelicus-지금까지 작업 한 프로젝트에서 서버가 "다운"(연결할 수 없음)으로 감지 될 때 이벤트를 발생시키는 주기적 모니터링 / 폴링 시스템 (웹 서버를 대상으로하기 때문에 간단한 HTTP GET 요청)을 구현했습니다. HTTP) 또는 "up"(다시 연결 가능). 일반적인 경우 "신뢰성"이 귀하의 경우에 의미하는 바를 정의하고 유사한 논리를 구현할 수 있습니다.
Simon Mourier 2015

9

Microsoft Windows Vista 및 7은 NCSI (Network Connectivity Status Indicator) 기술을 사용합니다.

  1. NCSI는 www.msftncsi.com에서 DNS 조회를 수행 한 다음 http://www.msftncsi.com/ncsi.txt 를 요청합니다 . 이 파일은 일반 텍스트 파일이며 ' Microsoft NCSI ' 텍스트 만 포함합니다 .
  2. NCSI는 dns.msftncsi.com에 대한 DNS 조회 요청을 보냅니다. 이 DNS 주소는 131.107.255.255로 확인되어야합니다. 주소가 일치하지 않으면 인터넷 연결이 올바르게 작동하지 않는 것으로 간주됩니다.

3
이것은 훌륭하지만 기술적으로 '네트워크'의 가용성에 관한 것이 아니라 'http를 통해 인터넷에 연결되어 있습니까?' 예를 들어 독립형 LAN에서는 완벽한 네트워크 연결이 가능하지만 인터넷에 연결되어 있지 않습니다. NCSI에 대한 자세한 내용은 다음을 참조하십시오
MichielB

1

네트워크 연결을 확인하려면이 메서드를 호출하십시오.

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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.