以编程方式清除WinInet DNS缓存

3

WinINet库会为访问的任何URL缓存IP地址。因此,当该URL的IP地址发生更改时,WinInet库的HttpSendRequest仍然会使用旧的IP地址。

而且,如果旧的IP地址响应,则WinINet将仅向旧的IP地址发送所有http请求。

是否有任何方法可以强制清除WinInet的DNS缓存?

或者

是否有任何办法可以强制WinINet将HTTP请求发送到指定的IP地址(因为我们可以使用gethostbyname()获取更新的IP)?

注意:

  1. gethostbyname给我提供了新的IP地址,所以这是WinINet缓存的行为。
  2. 我尝试过这篇MS文章中建议的“方法2”,但没有帮助
  3. 示例代码

有点粗糙,但你能否生成一个单独的进程?这是命令行:ipconfig /flushdns - Tom
@Tom ipconfig /flushdns 只会清除系统 DNS 缓存。但 WinInet 会维护自己的 DNS 缓存,该命令无法清除它。 - Pradeep
我不知道!对不起,祝你好运。 - Tom
1个回答

2
您可以尝试在连接时使用flag

INTERNET_FLAG_DONT_CACHE = 0x04000000 不将返回的实体添加到缓存中。这与首选值INTERNET_FLAG_NO_CACHE_WRITE相同。

或者您可以查看WinInet文档中的DeleteUrlCacheEntry 此处 我相信这应该能解决问题。
--更新
此文档中,我发现有一个更好的标志可供使用,请查看:

INTERNET_FLAG_PRAGMA_NOCACHE 强制请求由源服务器解析,即使代理上存在缓存副本。

--更新
如@Pradeep测试的那样,您可以更改此注册表键以使其工作: HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\DnsCacheEnabled ServerInfoTimeOut和DnsCacheTimeout设置为0。

你尝试过DeleteUrlCacheEntry吗? - Diego Garcia
似乎wininet.dll从以下位置读取注册表键DnsCacheEnabled:SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\Cache以及SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\Cache使用Security_HKLM_only。 - Diego Garcia
我没有看到WinInet在其路径中使用任何带有DnsCacheEnabled的键。如果您能指出任何提到这一点的文档,那将会很有帮助。 - Pradeep
我在使用PE Explorer时看到了这个,抱歉我忘了说。 - Diego Garcia
DnsCacheEnabled 存在于 HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings 中。但是为了使其生效,我还需要将 ServerInfoTimeOutDnsCacheTimeout 设置为 0。感谢你的帮助。请问是否可以修改您的回答,以便我接受它? - Pradeep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接