2009-02-06 13 views

답변

135
당신은 .NET 2.0에서 네트워크 연결을 확인할 수 있습니다

사용 GetIsNetworkAvailable() :

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged 
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged 
+8

"제한적으로 사용 가능합니까?" – tofutim

+0

이것은 WPF에서 항상 작동하지 않습니다. 일부 랩톱은 false를 반환하고 일부는 true를 반환합니다. – krilovich

+0

이것이 실제로 작동합니까? 방금이 라인을 작성하고 라우터를 끄고 여전히 true를 반환합니다! – Mushfiq

143
:

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 

NetworkChange 클래스에서 이벤트를 사용하여 네트워크 가용성의 IP 주소를 변경하거나 변경 사항을 모니터링하려면

표시된 답변은 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; 
    } 
+14

이 올바른지 많은 upvotes받을 자격이 있습니다 - 나는이 응답에서 언급 한 가상 어댑터 아마도 가상 컴퓨터에 대한 추가 확인에 대한 – Marek

+1

+1로 인해 발생합니다 수락 된 대답을 언급 한 NetworkAvailabilityChanged 이벤트가 안정적으로 발생하지 것을 발견했습니다. 어제이 사건에 빠지게. 그러나 나는 여전히 그들의 이름에 '가상'이 없기 때문에 이것이 'Hype-V'를 다루지 않는다고 생각한다. – Herdo

+1

@Herdo - 예, 코드가 완벽하지 않으며 가상 세계에서 완벽한 코드가 될 수 있다고 생각하지 않습니다. 그러나 당신은 그것을 향상시킬 수 있습니다. –

8

마이크로 소프트 윈도우 비스타와 7을 사용하여 NCSI (네트워크 연결 상태 표시기) 기술 :

  1. NCSI는 DNS 조회에 수행 www.msftncsi.com을 입력 한 다음 http://www.msftncsi.com/ncsi.txt을 요청하십시오. 이 파일은 일반 텍스트 파일이며 'Microsoft NCSI'텍스트 만 포함합니다.
  2. NCSI가 dns.msftncsi.com에 대한 DNS 조회 요청을 보냅니다. 이 DNS 주소는 131.107.255.255로 확인되어야합니다. 주소가 일치하지 않으면 인터넷 연결이 제대로 작동하지 않는다고 가정합니다.
+2

이것은 훌륭하지만 기술적으로 '네트워크'의 가용성에 관한 것은 아니지만 'http를 통해 인터넷에 연결되어 있습니까?' 완벽한 네트워크 연결은 가능하지만 인터넷에 연결할 수는 없습니다 (예 : 독립 실행 형 LAN). NCSI에 대한 자세한 정보 참조 : http://technet.microsoft.com/en-us/library/cc766017.aspx – 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); 
관련 문제