【问题标题】:How to detect internet access? [closed]如何检测互联网访问? [关闭]
【发布时间】:2014-05-21 07:13:01
【问题描述】:

我需要创建一个可靠的测试来查看当前主机是否可以使用 HTTP(端口 80)或 HTTPS(端口 443)访问公共互联网。

这不是编程语言问题。我已经覆盖了那部分。

我的想法是,我将针对公共互联网上的某些东西进行测试

  1. 永远活着

  2. 可以响应 HTTP 或 HTTPS 请求

  3. 可以快速响应(我想我会做一个 HEAD 请求以保持回复小)

  4. 在可预见的未来也会存在

那个端点是什么?是否有一些官方服务器可以做出上述承诺,例如w3.org 提供的东西? (我知道人们倾向于使用www.google.com 或类似名称,但我觉得这不是一个好的解决方案,或者?...)。

我的进一步想法是:

  • 不要使用 ping 测试之类的东西,因为 ICMP 被许多人阻止 防火墙。

  • 可能需要是真正的 HTTP/HTTPS 请求才能通过 潜在的防火墙。如果有,一个普通的套接字测试可能会给出错误的结果 中间有防火墙。所以我会做一个真正的 HTTP/HTTPS 测试。我的 HTTPS 测试将忽略证书,因为那不是我想要测试的。

  • 无论我做什么,我都会间接测试名称解析(除非我正在测试一个我认为不太可能的 IP 地址)。还行吧。无论如何,名称解析也是“互联网连接”的一部分。

执行互联网连接测试最可靠的方法是什么(我只关心 HTTP 和 HTTPS)以及我应该使用哪个端点?

我假设在我之前的成千上万的开发人员已经解决了这个问题。但是怎么做呢?

更新和最终解决方案

似乎我不会让任何人用官方端点来回答这个目的(也许没有一个?)所以我要做的是向google.com发送一个HTTP HEAD请求。我的请求将包含 HTTP 标头元素 cache-control: no-cache,希望避免任何中间代理从他们自己的缓存中回答我。然后,我将对 HTTPS 重复完全相同的测试。

没有完美的测试,但根据我的要求,以上似乎是最接近的。

感谢所有回答的人。

【问题讨论】:

  • “这不是一个编程语言问题”意味着它可能不是 stackoverflow 的问题,也许superuser 可能更有帮助。无论如何,google.com 有什么问题?不要事情会有一个具有更好可用性的站点。也许尝试检查多个站点以防第一个失败。
  • 用“hello”的内容制作一个pastebin并请求它的html。
  • 当然,您可以联系到google.com 并不一定意味着您可以访问互联网——您很可能正在与某个地方的代理交谈。至少做一个适当的谷歌搜索请求,奇怪和随机的:)
  • 你是 assuming correctly 关于“我之前的成千上万的开发人员已经解决了这个问题”。
  • @Luaan:你是对的,但我想我可以在 HTTP HEAD 请求上设置一些标头元素,以确保任何中间代理都不会尝试从自己的缓存中提供服务?

标签: java c# networking connection


【解决方案1】:

我建议你看看this host list。选择几个你认为合理的主机,然后执行以下操作:

// create a client
var httpClient = new HttpClient();
// create a request to your site / host
var request = new HttpRequestMessage(HttpMethod.Head, new Uri(your-host));
// await it
var response = await httpClient.SendAsync(request);
// Check that the response seems valid, so that it is not just a redirect somewhere else

并捕获任何抛出的异常。

但请注意,很难辨别您是否有实际的互联网访问权限,因为没有所谓的“完全”互联网访问权限。您必须定义互联网访问的含义:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2022-07-10
    • 2015-05-19
    相关资源
    最近更新 更多