zoukankan      html  css  js  c++  java
  • 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函数就可以。



  • 相关阅读:
    字符编码相关
    函数之形参与实参
    文件操作模式
    函数对象,名称空间,作用域,和闭包
    吴裕雄天生自然SPRINGBOOT开发实战处理'spring.datasource.url' is not specified and no embedded datasource could be autoconfigured
    吴裕雄天生自然SPRINGBOOT开发实战处理XXXX that could not be found.
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot HTML表单登录
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot REST示例
    吴裕雄天生自然SpringBoot开发实战学习笔记处理 Could not write metadata for '/Servers'.metadata\.plugins\org.eclipse.core.resources\.projects\Servers\.markers.snap (系统找不到指定的路径。)
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot Tomcat部署
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6992203.html
Copyright © 2011-2022 走看看