当前位置:  开发笔记 > 编程语言 > 正文

如何检查网络连接?

如何解决《如何检查网络连接?》经验,为你挑选了3个好方法。

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



1> Simon Mourie..:

标记的答案是100%罚款,但是,在某些情况下标准方法被虚拟卡(虚拟盒,...)欺骗.通常还需要根据速度(串行端口,调制解调器......)丢弃某些网络接口.

这是一段检查这些情况的代码:

    /// 
    /// Indicates whether any network connection is available
    /// Filter connections below a specified speed, as well as virtual network cards.
    /// 
    /// 
    ///     true if a network connection is available; otherwise, false.
    /// 
    public static bool IsNetworkAvailable()
    {
        return IsNetworkAvailable(0);
    }

    /// 
    /// Indicates whether any network connection is available.
    /// Filter connections below a specified speed, as well as virtual network cards.
    /// 
    /// The minimum speed required. Passing 0 will not filter connection using speed.
    /// 
    ///     true if a network connection is available; otherwise, false.
    /// 
    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;
    }


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

2> Mitch Wheat..:

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

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

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

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


这会照顾"有限的可用性"吗?

3> 小智..:

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

    NCSI在www.msftncsi.com上执行DNS查找,然后请求http://www.msftncsi.com/ncsi.txt.此文件是纯文本文件,仅包含文本" Microsoft NCSI ".

    NCSI发送dns.msftncsi.com的DNS查找请求.此DNS地址应解析为131.107.255.255.如果地址不匹配,则假定互联网连接无法正常运行.


这很棒,但技术上并不是关于"网络"的可用性,而是"我是否通过http连接互联网?" 您可以拥有完美的网络连接,但无法连接到互联网,例如在独立的局域网上.有关NCSI的更多信息,请参阅:http://technet.microsoft.com/en-us/library/cc766017.aspx
推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有