如何检查网络连接?

Bra*_*rad 109 c# networking

确定是否有可用的网络连接的最佳方法是什么?

Sim*_*ier 170

标记的答案是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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的,值得许多upvotes - 我发现在接受的答案中提到的NetworkAvailabilityChanged事件未被可靠触发,这可能是由此答案中提到的虚拟适配器引起的 (17认同)
  • @Herdo - 是的,代码并不完美,我认为*在虚拟世界中没有任何完美的东西.但你可以改进它. (3认同)

Mit*_*eat 148

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

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
Run Code Online (Sandbox Code Playgroud)

要监视IP地址的更改或网络可用性的更改,请使用NetworkChange类中的事件:

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
Run Code Online (Sandbox Code Playgroud)

  • 这会照顾"有限的可用性"吗? (9认同)

小智 9

Microsoft Windows Vista和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.如果地址不匹配,则假定互联网连接无法正常运行.

  • 这很棒,但技术上并不是关于"网络"的可用性,而是"我是否通过http连接互联网?" 您可以拥有完美的网络连接,但无法连接到互联网,例如在独立的局域网上.有关NCSI的更多信息,请参阅:http://technet.microsoft.com/en-us/library/cc766017.aspx (3认同)