如何检查网络连接?


Answers:


153

您可以使用GetIsNetworkAvailable()以下命令在.NET 2.0中检查网络连接:

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 2012年

1
+1表示对虚拟机的其他检查。昨天刚遇到这种情况。但是我仍然认为这不能处理“ Hype-V”,因为他们的名字没有“ virtual”。
Herdo 2014年

3
@Herdo -是的,代码不是完美的,我不认为有可能是在虚拟世界中任何事情完美。但是您可以改善它。
Simon Mourier 2014年

@SimonMourier你是对的。只是想指出,如果有人仍然返回true,如果没有连接->这可能是一个问题:)
Herdo

1
@noelicus-到目前为止,在我一直在从事的项目中,我实现了一个定期监视/轮询系统(因为我将Web服务器定位为简单的HTTP GET请求),因此当服务器被检测为“关闭”(无法访问)时会引发事件通过HTTP)或“向上”(再次可访问)。在一般情况下,您可以定义“可靠”在您的情况下的含义,并实现类似的逻辑。
西蒙·穆里尔

9

Microsoft Windows Vista和Windows 7使用NCSI(网络连接状态指示器)技术:

  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连接互联网?” 您可以拥有完美的网络连接,但无法连接到Internet,例如在独立的局域网上。有关更多信息,请参见NCSI:technet.microsoft.com/en-us/library/cc766017.aspx
MichielB 2015年

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.