2009-02-06 99 views

回答

135

您可以为您在.NET 2.0的网络连接使用GetIsNetworkAvailable()

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 

要监控的IP地址或网络可用性的变化而变化,从使用的NetworkChange类的事件:

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

这是否照顾“有限的可用性”? – tofutim 2011-09-13 00:51:57

+0

这并不总是在WPF中工作。一些笔记本电脑返回假,一些返回true – krilovich 2016-02-10 17:21:06

+0

这真的有用吗?我只写了这一行,并关闭了我的路由器,仍然返回true! – Mushfiq 2017-05-20 23:37:55

143

标记的答案是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; 
    } 
8

Microsoft Windows Vista和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。如果地址不匹配,则认为互联网连接无法正常工作。
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);