嵌入式Linux设备检测互联网连接的智能方法

3

我们的团队正在开发一种基于Linux 2.6的互联网媒体设备。目前,我们通过ping www.google.com来检测是否已建立互联网连接(通过有线以太网接口)。

我们在某些测试网络上发现,该设备不支持ICMP数据包转发,因此应用程序代码错误地报告互联网不可用。

是否有更精细的方法来推断是否可以通过/dev/eth0获得互联网连接,而不必依赖于ping一个知名服务?


我已经回答了这个问题,这是一个重复的问题。你可以去查看一下。 - P Shved
嗨Pavel,你提出了一个有趣的观点。什么是“连接”?确实有不同的想法,即最终用户需要多么“连接”。对于我们应用程序的目的,我们的设备需要能够解析DNS地址,并与Internet上大量其他机器(对等体)进行任意消息交换,其身份仅在运行时得知。就个人而言,我对ChristopheD提出的默认路由检查感到满意。ICMP回显方法明显存在缺陷,因为许多网络链接的管理员禁止其链接上所有类型的ICMP流量。 - sototozo
2个回答

5
作为那篇被ChristopheD引用的答案的作者,我不会采用这种方法。在另一个问题中这种方法有效,因为我们正在检查当前机器是否存在直接PPP连接,而在这种情况下,您连接到任意网络,该网络可能已经具有默认路由,与其更广泛的互联网连接无关。
因为你的应用需要全局的DNS连接,我会检查它 - 查找你知道永远存在的地址,比如对"com."域名进行"NS"类型查询。使用相当长的超时时间和/或尝试几次后放弃。类似这样:
dig NS +aaonly com.

忽略输出并测试退出值 - 0表示查询能够联系根服务器,其他任何值都表示无法联系。


2

最终你希望设备能够使用互联网进行一些有用的功能。如果有一个明确定义的服务器是设备常连接的,那么向该服务器发送查询将非常有用。

在“无用”和“有用功能”之间有许多步骤,你可以通过检查其中任何一步作为“连通性”的某种度量:

  • 以太网电缆插入(或PPP链接建立、Wi-Fi等低层协议)
  • DHCP服务器分配地址(如果适用)
  • 默认网关正在运行
  • DNS服务器正在响应
  • 目标服务器正在响应(可能不是ICMP ping,而是一个小型HTTP查询或其他你可能使用的协议)

根据你的客户的熟练程度,或者如果你想要一个有用的错误/诊断,他们可以报告给技术支持,检测所有这些可能会很有用。

作为诊断工具,跟踪路由也可能非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接