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 要么抛出异常,要么地址列表为非空,但我不确定。

Dns.GetHostEntry 是否可以返回带有空地址列表的 IPHostEntry

不,您不会看到空地址列表:即使您查询确实存在但没有 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 记录 — 指示主机本身存在,但不是 可直接到达。

所以这几乎回答了我的问题:)

这里有三种可能的情况:

  1. 主机名存在(DNS 有 A 记录)并解析为 IP 地址

    • 条件永远不会被击中
  2. 主机名存在(DNS 知道域),但不存在 A 记录。

    • 这是一个极不可能的情况,我认为这首先永远不会发生。
  3. 主机名不存在

    • 抛出异常,你永远不会到达那里。

所以不,我认为这永远不会发生。

答案是肯定的。方法在 DNS 服务器中查询与 IP 地址关联的 IP 地址和别名。

如果本地计算机未安装 IPv6,则会从 GetHostEntry 方法的结果中筛选 IPv6 地址。因此,如果地址参数只有 IPv6 结果可用,则可以返回空的 IPHostEntry 实例。

此方法不填充返回的 IPHostEntry 实例的别名属性,并且将始终为空。