[从0到1搭嵌入式工程]监测外网连接情况gethostbyname

本文探讨了设备实时监测外网连接的策略,包括利用DNS服务器(如百度DNS、国内运营商DNS及Google DNS)进行ping测试,以及通过自有服务器的在线信号、定时ping或gethostbyname函数检查连接状态的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设备要想实时监测外网连接情况,肯定是需要在外网上有一个点,可以让你一直监测设备与这个点之间的连接情况。这个点,就肯定是处在外网中的服务器。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值