【问题标题】:An elegant / simple way to check whether internet is available or not检查互联网是否可用的优雅/简单方法
【发布时间】:2010-03-16 05:47:45
【问题描述】:

我快速搜索了如何检查 Internet 是否可用。他们中的大多数人都谈到了对 wininet.dll 进行 InterOp 调用。

其中一个答案指向 System.Net.NetworkInformation 命名空间。探索命名空间,我发现了一个 Ping 类,它可以用来从代码 ping 我们的服务器,并检查服务器是否可用。

我想问的是这个解决方案与其他解决方案相比如何?

Ping soPing = new Ping();
var soPingReply = soPing.Send("www.stackoverflow.com");
if (soPingReply.Status != IPStatus.Success)
{
    // SO not available
}

【问题讨论】:

    标签: .net windows tcp


    【解决方案1】:

    试试这个:

    [DllImport("wininet.dll")]
    private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
    
    //Creating a function that uses the API function...
    public static bool IsConnectedToInternet()
    {
        int Desc;
        return InternetGetConnectedState(out Desc, 0);
    }
    

    【讨论】:

    • 这个解决方案与我提供的解决方案相比如何?
    • 它使用标准的win32方法。问题是您不需要回答“‘互联网可用’是什么意思?”的问题。如果您“拥有”互联网,但暂时关闭了怎么办?你必须在这里实现更复杂的逻辑(检查几个网站的例子),或者依赖 Windows 内置工具。至于我,我更愿意检查我需要的具体站点/服务器的可用性,而不是整个互联网。这些信息通常更有用。(当然,如果您正在构建搜索引擎,则不是:)))
    • “我实际上想检查与客户站点之一的连接。如果存在则加载它,否则在 Web 浏览器控件中加载离线页面。”正如您所建议的,检查该特定站点/服务器始终是更好的选择。我该怎么办?
    • 我使用简单的 try-catch(TimeOutException ex) 实现了这个真的,谷歌这个问题,那里有很多答案,我不是最好的,可能,这取决于特殊情况。
    【解决方案2】:

    网络连接与 ping 某些(随机?)站点的能力无关。 如果您位于防火墙后面,或者目标是 ping(或响应),则很可能会在实际流量没有被阻止时被阻止。

    即使该 ping 有效,也不能保证在您发出实际请求时连接仍会正常。 所以最好只做实际的请求,并确保你正确处理任何可能发生的网络错误。

    【讨论】:

    • 我实际上想检查与客户站点之一的连接。如果存在则加载它,否则在 Web 浏览器控件中加载离线页面。
    • 同样的事情。只是尝试加载它。如果失败,显示离线页面,如果没有,则显示真实页面。
    【解决方案3】:

    它会尝试 ping 多长时间?如果您的应用在此期间锁定了 30 秒,这有关系吗?

    您是否有互联网连接但暂时断开?

    是互联网宕机还是 SO 网站?

    如果本地防火墙阻止 ping 怎么办?

    【讨论】:

    • IPStatus 枚举有相当多的状态字段。对于您提到的案例,它可能会返回成功以外的其他内容。此外,在 ping 时,还可以指定超时时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2018-02-16
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多