【多网段切换导致DNS域名解析失败问题处理】
文章目錄
- 🔴問題描述:
- 🟠問題排查:
- 🟡問題解決:
- 🟢知識擴(kuò)展:
- 🔵res_init() 簡介:
- 作用:
- 所屬庫:
- 示例:
- 描述
- 相關(guān)文件
- 🟣引經(jīng)據(jù)典:
🔴問題描述:
設(shè)備有LAN和WIFI兩種網(wǎng)絡(luò)方式,測試時(shí)LAN和WIFI分別連接在兩個(gè)不同的路由器上,切換兩個(gè)網(wǎng)絡(luò)(只啟用LAN或者WIFI)時(shí)發(fā)現(xiàn)設(shè)備的mqtt程序重連服務(wù)器會(huì)失敗(服務(wù)器地址使用的是域名)。
🟠問題排查:
初步排查時(shí)發(fā)現(xiàn)重啟mqtt程序,可以正常連接。但是使用mqtt的斷網(wǎng)重連功能發(fā)現(xiàn)就不行。最后研讀mqtt源碼,發(fā)現(xiàn)是調(diào)用
getaddrinfo函數(shù)失敗了,順藤摸瓜去排查這個(gè)函數(shù)與DNS相關(guān)的地方。
🟡問題解決:
需要在DNS解析失敗時(shí),重新加載一下DNS。所以在mqtt斷鏈的回調(diào)里加入了res_init()函數(shù),問題解決,重連成功。
🟢知識擴(kuò)展:
如果在程序中調(diào)用getaddrinfo和getnameinfo來獲取域名對應(yīng)的IP,在同一進(jìn)程中,上一次成功獲取的結(jié)果會(huì)被保留下來,即使在下一次調(diào)用之前disable了DNS并清空了系統(tǒng)的DNS緩存,下一次仍然能夠解析出正確的IP。此時(shí)需要在調(diào)用這兩個(gè)函數(shù)之前用res_init()函數(shù)來清空他們自己保留的緩存。
🔵res_init() 簡介:
作用:
搜索默認(rèn)域名和 Internet 地址。
所屬庫:
標(biāo)準(zhǔn) C 庫 ( libc.a )
示例:
#include <sys/types.h> #include <netinet/in.h> #include <arpa/nameser.h> #include <resolv.h>void res_init ( )描述
res_init子例程讀取/etc/resolv.conf文件以獲取默認(rèn)域名和運(yùn)行名稱服務(wù)器的初始主機(jī)的 Internet 地址。
注意:如果/etc/resolv.conf文件不存在,res_init子例程會(huì)嘗試使用本地/etc/hosts文件進(jìn)行名稱解析。如果系統(tǒng)沒有使用域名服務(wù)器,則/etc/resolv.conf文件不應(yīng)該存在。即使系統(tǒng)正在使用名稱服務(wù)器,系統(tǒng)上也應(yīng)該存在/ etc/hosts文件。在這種情況下,該文件應(yīng)包含系統(tǒng)運(yùn)行所需的主機(jī) ID,即使名稱服務(wù)器未運(yùn)行也是如此。
res_init子例程是構(gòu)成解析器的一組子例程之一,解析器是一組將域名轉(zhuǎn)換為 Internet 地址的函數(shù)。所有解析器子例程都使用/usr/include/resolv.h文件,該文件定義了_res結(jié)構(gòu)。res_init子例程將域名信息存儲在_res結(jié)構(gòu)中。三個(gè)環(huán)境變量LOCALDOMAIN、RES_TIMEOUT和RES_RETRY影響與_res結(jié)構(gòu)相關(guān)的默認(rèn)值。
所有包含res_init子例程的應(yīng)用程序都必須在編譯時(shí)將_BSD宏設(shè)置為特定值。可接受的值為 43 和 44。此外,所有套接字應(yīng)用程序都必須包含 BSD libbsd.a庫。
相關(guān)文件
| /etc/resolv.conf | 包含名稱服務(wù)器和域名。 |
| /etc/hosts | 包含網(wǎng)絡(luò)中主機(jī)的主機(jī)名及其地址。此文件用于將主機(jī)名解析為 Internet 地址。 |
🟣引經(jīng)據(jù)典:
https://blog.csdn.net/weixin_39530839/article/details/116778660?utm_source=app&app_version=5.3.0
https://www.ibm.com/docs/zh/aix/7.3?topic=r-res-init-subroutine
總結(jié)
以上是生活随笔為你收集整理的【多网段切换导致DNS域名解析失败问题处理】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020新电商营销白皮书
- 下一篇: 2021小程序该怎么做?爆款产品拆解案例