【问题标题】:How to Clear/Flush the DNS Cache in Win32 API's如何清除/刷新 Win32 API 中的 DNS 缓存
【发布时间】:2018-08-24 15:14:23
【问题描述】:

我正在寻找一种以编程方式清除/刷新本地 win32 dns 缓存的方法(相当于调用“ipconfig /flushdns”)。

有一些方法可以通过 winsock.dll 中的隐藏 API 执行此操作,但 winsock.dll 不再是 Windows 的一部分,因此该方法将不再有效。

有人知道现在应该怎么做吗?

【问题讨论】:

标签: winapi dns


【解决方案1】:
  • 使用Dependency Walker检查ipconfig.exe的依赖关系
  • 在其中找到dnsapi.dll
  • 检查其导出的函数,发现DnsFlushResolverCache
  • 浅浏览网页,发现其签名(仅在官网找到这样的引用:[MS.Docs]: Windows 8 API Sets),表示它是公开的,所以依赖它的软件,不是健壮
  • 创建了一个小测试程序

main00.c

#include <stdio.h>
#include <Windows.h>

typedef BOOL (WINAPI *DnsFlushResolverCacheFuncPtr)();


int main() {
    HMODULE dnsapi = LoadLibrary("dnsapi.dll");
    if (dnsapi == NULL) {
        printf("Failed loading module: %d\n", GetLastError());
        return -1;
    }
    DnsFlushResolverCacheFuncPtr DnsFlushResolverCache = (DnsFlushResolverCacheFuncPtr)GetProcAddress(dnsapi, "DnsFlushResolverCache");
    if (DnsFlushResolverCache == NULL) {
        printf("Failed loading function: %d\n", GetLastError());
        FreeLibrary(dnsapi);
        return -2;
    }
    BOOL result = DnsFlushResolverCache();
    if (result) {
        printf("DnsFlushResolverCache succeeded\n");
    } else {
        printf("DnsFlushResolverCache succeeded: %d\n", GetLastError());
    }
    FreeLibrary(dnsapi);
    return 0;
}

输出

e:\Work\Dev\StackOverflow\q052007372>"c:\Install\x86\Microsoft\Visual Studio Community\2015\vc\vcvarsall.bat" x64

e:\Work\Dev\StackOverflow\q052007372>dir /b
dnsapi_func_list.txt
main00.c

e:\Work\Dev\StackOverflow\q052007372>cl /nologo main00.c  /link /OUT:main00.exe
main00.c

e:\Work\Dev\StackOverflow\q052007372>dir /b
dnsapi_func_list.txt
main00.c
main00.exe
main00.obj

e:\Work\Dev\StackOverflow\q052007372>main00.exe
DnsFlushResolverCache succeeded

注意:即使函数调用成功完成,我也不确定如何检查它是否做了它应该做的事情(或者更好的是:它的名字暗示它应该做什么,这似乎成为你所需要的)。
让我知道它是如何工作的。



更新#0

感谢@TimJohnson 提供的信息!我也急于查看ipconfig /? ([MS.Docs]: ipconfig) 输出(我在另一个 cmd 窗口中看到的 :d )并注意选项 :) 。
确实工作(缓存已大量更新,我可以看到运行程序前后的差异)!!!

【讨论】:

  • 谢谢,太好了,很好找到。您可以使用命令“ipconfig /displaydns”检查解析器缓存。它将列出缓存中的内容,之后当然应该是空的。 (而且是给我的)
猜你喜欢
  • 2023-01-29
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2011-03-14
  • 2018-05-25
  • 2014-07-02
  • 2013-12-31
  • 1970-01-01
相关资源
最近更新 更多