作者:小丁啊小丁 | 来源:互联网 | 2022-12-06 17:54
我正在寻找一种以编程方式清除/刷新本地win32 dns缓存的方法(等同于调用“ ipconfig / flushdns”)。
有一些方法可以使用winsock.dll中的隐藏API来执行此操作,但是winsock.dll不再是Windows的一部分,因此该方法将不再起作用。
有谁知道现在应该怎么做?
1> CristiFati..:
使用Dependency Walker检查ipconfig.exe的依赖项
在其中找到dnsapi.dll
检查其导出的功能,并发现DnsFlushResolverCache
浅度浏览网络并找到其签名(仅在官方网站上[MS.Docs]:Windows 8 API Sets上找到类似的引用),这意味着它不是公共的,因此依赖它的软件并不可靠)
创建了一个小型测试程序
test.c:
#include
#include
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)并注意到该选项:)。
它的确起作用(缓存已大量更新,在运行该程序之前和之后,我可以看到差异)!