设备要想实时监测外网连接情况,肯定是需要在外网上有一个点,可以让你一直监测设备与这个点之间的连接情况。这个点,就肯定是处在外网中的服务器。
1,DNS服务器
180.76.76.76 (百度DNS)、 114.114.114.114(国内移动、电信和联通通用的DNS)、8.8.8.8(google DNS)
可以用定期ping DNS服务器的方式监测与DNS的连接情况,任意一个联通,即为连接上外网。但是全球化时候,不是所有的地区都能连接到指定的DNS服务器,但是通过路由器,仍然能够连接到外网, 所以这种方式存在覆盖不全的问题。
2,我们自己的服务器
自己的服务器是设备正常工作所需要连接的服务器,所以连接上我们自己的服务器,才能认为设备是真的连到了外网。
a, 首先考虑,设备的固件模块中,是否已经有和我们服务器一致保持连接的模块,如果有,而且频率合适,就可以直接用这个模块的监测结果。如 online信号, 如果每隔10s设备和服务器就会有一个online产生,那么直接使用这个online是否成功来判断是否连上外网就可以了。但是设备与后台的心跳,可能是2小时,也可能更长,不能实时标识连接情况。这时就不能用了。
b, 用定时ping服务器的方式? 后台服务器为了防攻击,ping功能可能是不开的。
c, 定时用gethostbyname(host_name), 如果有多个服务器 主机名host_name,就一个一个试,有一个通,就为成功。 注意host_name不加http字样,直接用www.baidu.com。
gethostbyname函数常用来向DNS查询一个域名的IP地址,也就是说只请求到DNS,对服务器自身没有压力。
首先要注意的是gethostbyname不是线程安全的,如果已经有其他线程在用这个函数,建议用_r的线程安全版本。
根据下面的文章,gethostbyname还可能会阻塞, 参见第二篇文章, gethostbyname_r函数也并没有传timeout参数进去,所以如果存在阻塞, _r函数也不可避免会阻塞。
关于函数的分析有下面两篇文章 https://blog.youkuaiyun.com/daiyudong2020/article/details/51946080 和 https://blog.youkuaiyun.com/shijun_zhang/article/details/6577426