1. 程式人生 > >[從0到1搭嵌入式工程]監測外網連線情況gethostbyname

[從0到1搭嵌入式工程]監測外網連線情況gethostbyname

裝置要想實時監測外網連線情況,肯定是需要在外網上有一個點,可以讓你一直監測裝置與這個點之間的連線情況。這個點,就肯定是處在外網中的伺服器。

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函式也不可避免會阻塞。