如何在Win32 API中清除/刷新DNS缓存

问题描述 投票:5回答:1

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

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

有谁知道现在应该怎么做?

winapi dns
1个回答
6
投票
  • 使用Dependency Walker检查ipconfig.exe的依赖项
  • 在其中找到了dnsapi.dll
  • 检查了它的导出函数,找到了DnsFlushResolverCache
  • 浅浏览网页,发现它的签名(在官方网站上只找到这样的引用:[MS.Docs]: Windows 8 API Sets),这意味着它不公开,所以依赖它的软件并不健全)
  • 创建了一个小测试程序

test.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
test.c

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

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

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

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

@ EDIT0:

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

© www.soinside.com 2019 - 2024. All rights reserved.