1、ipconfig /flushdns的作用
ipconfig /flushdns 這是清除DNS緩存用的。
當訪問一個站點時系統將從DNS緩存中讀取該域名所相應的IP地址,當查找不到時就會到系統中查找hosts文件,假設還沒有那么才會向DNSserver請求一個DNS查詢,DNSserver將返回該域名所相應的IP,在你的系統收到解析地址以后將使用該IP地址進行訪問,同一時候將解析緩存到本地的DNS緩存中。假設DNS地址無法解析,或者是DNS緩存中的地址錯誤,一般才會使用ipconfig/flushdns來清除全部的DNS緩存。
2、通過調用API函數來實現該命令行命令的運行
通過該命令的組成形式就可以得知,/flushdns應該是作為參數傳給ipconfig.exe可運行程序的。假設要實現該命令的運行,能夠使用system()函數,將ipconfig /flushdns作為參數來傳入,該函數的運行受環境變量的影響,實際使用時可能存在問題。也能夠考慮使用ShellExecute啟動ipconfig.exe,並將/flushdns作為參數傳遞進來,但這樣做也有問題,比方可能會遭到殺毒軟件的攔截,對於Win7、Win8系統,可能會由於UAV權限問題被警告。
所以要看看有沒有相應的API函數可供使用,直接調用API則最有效最安全。於是到MSDN中嘗試着搜索,可是找不到相關的函數。既然是傳遞/flushdns參數運行ipconfig.exe,那嘗試着使用VC自帶的Depends工具看看是否能找到相應的接口。結果發現了其依賴的DNSAPI.DLL中有叫做DnsFlushResolverCache函數,例如以下圖所看到的:
這個函數應該是非公開的API函數,那能夠使用LoadLibrary顯示載入,並用GetProcess得到函數指針,直接調用之就可以。通過搜索,得到該函數的原型聲明:
BOOL WINAPI DnsFlushResolverCache(VOID);
從DNSAPI.DLL動態庫中顯式載入調用DnsFlushResolverCache的代碼例如以下所看到的:
BOOL __stdcall DnsFlushResolverCache() { BOOL bRet = FALSE; typedef BOOL (WINAPI *PfuncDnsFlushResolverCache)(VOID); HMODULE hDnsModule = LoadLibrary( _T("dnsapi.dll") ); if ( hDnsModule != NULL ) { PfuncDnsFlushResolverCache pFlushFun = GetProcAddress( hDnsModule, "DnsFlushResolverCache" ); if ( pFlushFun != NULL ) { pFlushFun(); bRet = TRUE; } FreeLibrary( hDnsModule ); } return bRet; }
3、通過調用API函數來實現該命令行命令的運行
今天由於系統出現問題,終端一直無法登錄到平台。為了解決該問題,將平台的網絡由聯通的網絡切換到電信的網絡,結果就出現了部分終端可以登錄,部分終端不能登錄的情況。考慮到可能是系統DNS緩存引起的,終端側將域名解析出來的地址一直是之前的聯通地址(即緩存中的地址),所以一直無法登錄。於是使用ipconfig /flushdns命令清理了一下系統的DNS緩存就可以正常登錄了。為了規避這樣由網絡切換和DNS緩存引起的問題,可以考慮在多次登錄失敗后自己主動去清理系統的DNS緩存。直接運行上面找到的DnsFlushResolverCache函數就可以。