以编程方式清除 WinInet DNS 缓存
Posted
技术标签:
【中文标题】以编程方式清除 WinInet DNS 缓存【英文标题】:Clear WinInet DNS cache programmatically 【发布时间】:2012-05-17 05:09:49 【问题描述】:WinINet 库缓存通过它访问的任何 URL 的 IP 地址。因此,当该 URL 的 IP 地址发生更改时,WinInet 库的 HttpSendRequest
也会转到较旧的 IP 地址。
而且,如果旧 IP 正在响应,则 WinINet 将仅将所有 http 请求发送到旧 IP。
有什么方法可以强制清除 WinInet 的 DNS 缓存?
或者
有什么方法可以强制 WinINet 向指定的 IP 地址发送 HTTP 请求(因为我们可以使用 gethostbyname()
获取更新的 IP)?
注意:
-
gethostbyname 给了我更新的 IP 地址,所以 WinINet 的缓存正在发生这种行为。
我尝试了this MS article 中建议的“方法 2”,但没有帮助
Sample code
【问题讨论】:
这有点像贫民窟,但你能生成一个单独的进程吗?这是命令行:ipconfig /flushdns
@Tom ipconfig /flushdns
仅刷新系统 DNS 缓存。但是 WinInet 维护着自己的 DNS 缓存,不能用这个命令清除。
我不知道!抱歉,祝你好运
【参考方案1】:
您可以尝试在连接时使用flag:
INTERNET_FLAG_DONT_CACHE = 0x04000000 不添加返回的实体 到缓存。这与首选值相同, INTERNET_FLAG_NO_CACHE_WRITE。
或者您可以查看 WinInet 文档here中的 DeleteUrlCacheEntry
我相信这应该可以解决问题。
--更新
来自this doc我看到有更好的flag可以使用,看看:
INTERNET_FLAG_PRAGMA_NOCACHE 强制请求由源服务器解析,即使代理上存在缓存副本。
--更新
正如@Pradeep 测试的那样,您可以更改此注册表项以使其工作: HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\DnsCacheEnabled ServerInfoTimeOut 和 DnsCacheTimeout 为 0。
【讨论】:
你试过 DeleteUrlCacheEntry 了吗? 它看到 wininet.dll 从以下位置读取注册表项 DnsCacheEnabled: SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\Cache and SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\5.0 \使用 Security_HKLM_only 缓存 我没有看到 WinInet 在其路径中使用任何带有 DnsCacheEnabled 的键。如果您指出任何提到这一点的文档,这将很有帮助。 我在 PE Explorer 中看到过这个,抱歉我忘了说。DnsCacheEnabled
存在于HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings
中。但是为了完成这项工作,我还必须将ServerInfoTimeOut
和DnsCacheTimeout
设置为0
。谢谢你的帮助。你能修改你的答案,让我接受吗?以上是关于以编程方式清除 WinInet DNS 缓存的主要内容,如果未能解决你的问题,请参考以下文章