Dns.GetHostEntry 是否可以返回带有空地址列表的 IPHostEntry
本文关键字:空地址 列表 IPHostEntry 返回 GetHostEntry 是否 Dns | 更新日期: 2023-09-27 17:47:22
我只是想知道是否可以成功解析主机名但返回的hostEntry.AddressList为空。
目前我正在做这样的事情:
IPHostEntry hostEntry = Dns.GetHostEntry("some.hostname.tld");
if (hostEntry.AddressList.Count() < 1)
{
// can that ever happen?
throw new ArgumentException("hostName has no assigned IP-Address");
}
TcpClient client = new TcpClient(hostEntry.AddressList[0], 1234);
我的假设是,如果找不到主机名,Dns.GetHostEntry 要么抛出异常,要么地址列表为非空,但我不确定。
不,您不会看到空地址列表:即使您查询确实存在但没有 A 或 AAAA (IPv6) 记录的 DNS 标签,也会抛出套接字异常("未知此类主机")。
可以通过查看 .NET 引用源版本中的 DNS .cs 中的函数InternalGetHostByName(string hostName, bool includeIPv6)
来验证这一点。除了一些特定于平台的预防措施外,DNS 查找是围绕 Winsock gethostbyname 函数的简单包装器。
Gethostbyname 将失败,或返回地址列表。永远不会返回空地址列表,因为在这种情况下,该函数将失败并显示WSANO_DATA("有效名称,没有请求类型的数据记录"),这转化为我们已经在 .NET 中看到的套接字异常。
编辑 2012 年 5 月,由响应提示,指出无论如何都会返回一个空列表:请注意,此答案仅适用于 Win32,并且像 WinCE 这样的平台的行为可能完全不同。如果您在 Win32 上看到"空列表"行为,并且您发出的请求是针对公开可用的 DNS 服务器发出的,请发布您的代码...
仅供记录。
感谢 mdb 接受的答案,我看了一下WSANO_DATA错误的描述:
请求的名称有效,并且在数据库中找到,但它确实有效 没有解析正确的关联数据。通常的例子 这是主机名到地址的转换尝试(使用 gethostbyname 或 WSAAsyncGetHostByName),它使用DNS(域名服务器)。MX 记录 返回但无 A 记录 — 指示主机本身存在,但不是 可直接到达。
所以这几乎回答了我的问题:)
这里有三种可能的情况:
-
主机名存在(DNS 有 A 记录)并解析为 IP 地址
- 条件永远不会被击中
-
主机名存在(DNS 知道域),但不存在 A 记录。
- 这是一个极不可能的情况,我认为这首先永远不会发生。
-
主机名不存在
- 抛出异常,你永远不会到达那里。
所以不,我认为这永远不会发生。
答案是肯定的。方法在 DNS 服务器中查询与 IP 地址关联的 IP 地址和别名。
如果本地计算机未安装 IPv6,则会从 GetHostEntry 方法的结果中筛选 IPv6 地址。因此,如果地址参数只有 IPv6 结果可用,则可以返回空的 IPHostEntry 实例。
此方法不填充返回的 IPHostEntry 实例的别名属性,并且将始终为空。