ipconfig /flushdns 清除系統DNS緩存


        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函數就可以。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM