WinSock getaddrinfo 从主机名获取 IP 失败,直到调用 ipconfig /flushdns
WinSock getaddrinfo to get IP from hostname fails until ipconfig /flushdns is called
通常通过调用 getaddrinfo
(实际上只是 WspiapiGetAddrInfo
的别名)从主机名获取 IP 地址。
我们看到了失败的案例。同时失败:
ping {hostname}
能够很好地解析主机名。
ping -4 {hostname}
也无法解析主机名,就像 getaddrinfo
.
修复 getaddrinfo
和 ping -4
失败情况的解决方案是 运行
ipconfig /flushdns
以上似乎表明 ping -4
和 getaddrinfo
正在使用内部 DNS 缓存中的(显然是错误的)条目解析地址。
有没有办法以编程方式清除缓存(做任何 ipconfig /flushdns
所做的事情),或者更好的是,让 getaddrinfo
不使用缓存?
Is there a way to programmatically clear that cache (doing whatever
ipconfig /flushdns does)
ipconfig /flushdns
这样做:
typedef BOOL(WINAPI *DFRC)();
DFRC DnsFlushResolverCache;
HMODULE hDll = LoadLibrary(L"DnsApi.dll");
DnsFlushResolverCache = (DFRC)GetProcAddress(hDll, "DnsFlushResolverCache");
BOOL bRet = DnsFlushResolverCache();
// code...
FreeLibrary(hDll);
通常通过调用 getaddrinfo
(实际上只是 WspiapiGetAddrInfo
的别名)从主机名获取 IP 地址。
我们看到了失败的案例。同时失败:
ping {hostname}
能够很好地解析主机名。ping -4 {hostname}
也无法解析主机名,就像getaddrinfo
.
修复 getaddrinfo
和 ping -4
失败情况的解决方案是 运行
ipconfig /flushdns
以上似乎表明 ping -4
和 getaddrinfo
正在使用内部 DNS 缓存中的(显然是错误的)条目解析地址。
有没有办法以编程方式清除缓存(做任何 ipconfig /flushdns
所做的事情),或者更好的是,让 getaddrinfo
不使用缓存?
Is there a way to programmatically clear that cache (doing whatever ipconfig /flushdns does)
ipconfig /flushdns
这样做:
typedef BOOL(WINAPI *DFRC)();
DFRC DnsFlushResolverCache;
HMODULE hDll = LoadLibrary(L"DnsApi.dll");
DnsFlushResolverCache = (DFRC)GetProcAddress(hDll, "DnsFlushResolverCache");
BOOL bRet = DnsFlushResolverCache();
// code...
FreeLibrary(hDll);