本文解决了在AF_INET6系列的另一次调用后调用时 GetAddrInfo 收到WSAHOST_NOT_FOUND错误的问题。
适用于:Windows 10 - 所有版本原始 KB 数: 4057932
现象
假设出现了下面这种情景:
- 使用不带任何后缀的平面名称来运行主机名的查询。
- 你有一个后缀搜索列表,此主机名可通过列表中最后一个后缀以外的其中一个后缀解析。
- 首先为 AF_INET6 系列运行
GetAddrInfo,然后为 AF_INET 系列运行该命令。
在此方案中,函数无法解析提供的主机名,并且会收到“WSAHOST_NOT_FOUND(11001)”错误消息。
例如,你有以下环境:
- 后缀搜索列表:
contoso.com、、foo.contoso.com``bar.contoso.com - 尝试解析的主机名:测试
- 主机 DNS A 记录存在于:
foo.contoso.com
尝试运行以下示例代码时,调用失败并出现 11001 错误。
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = 0;
hints.ai_family = AF_INET6;
getaddrinfo("test", NULL, &hints, &res)
hints.ai_family = AF_INET;
getaddrinfo("test", NULL, &hints, &res)
解决方法
可以使用以下方法避免此问题。 如果出现以下情况,则不会出现此问题:
- 对家庭使用AF_UNSPEC,让我们的代码为你确定 A/AAAA 结果。
- 将带有匹配主机 A 记录的后缀作为后缀搜索列表中的最后一个条目。
- 在 DNS 客户端上禁用负缓存。
- 传递要解析的完全限定主机名。
第一个选项是建议的方法,因为通常不需要为每个家庭执行调用,并且 Windows 经过更好的优化,以返回两个家庭的最佳结果集。