3

我只是想知道是否存在可以成功解析主机名但返回的 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 如果未找到主机名或 AddressList 不为空,则会引发异常,但我不确定。

4

4 回答 4

1

不,您不会看到一个空的地址列表:即使您查询一个确实存在但没有 A 或 AAAA (IPv6) 记录的 DNS 标签,也会抛出一个 SocketException(“No such Host is Known”)。

您可以通过查看InternalGetHostByName(string hostName, bool includeIPv6).NET 参考源版本中的 DNS.cs 中的函数来验证这一点。除了一些特定于平台的预防措施外,DNS 查找是 Winsock gethostbyname函数的简单包装。

Gethostbyname 要么失败,要么返回地址列表。永远不会返回一个空的地址列表,因为在这种情况下,函数将失败并返回 WSANO_DATA(“有效名称,没有请求类型的数据记录”),这意味着我们已经在 .NET 中看到了套接字异常。

编辑 2012 年 5 月,响应提示无论如何都会返回一个空列表:请注意,此答案仅适用于 Win32,并且 WinCE 等平台的行为可能完全不同。如果您在 Win32 上看到“空列表”行为,并且您提出的请求针对的是公开可用的 DNS 服务器,请发布您的代码...

于 2008-10-01T08:00:25.617 回答
1

只是为了记录。

感谢 mdb接受的答案,我查看了 WSANA_DATA 错误的描述

请求的名称有效并且在数据库中找到,但它没有正确的关联数据正在解析。通常的示例是使用 DNS(域名服务器)的主机名到地址转换尝试(使用 gethostbyname 或 WSAAsyncGetHostByName)。返回一条 MX 记录,但没有 A 记录——表明主机本身存在,但不能直接访问。

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

于 2008-10-01T10:41:25.950 回答
0

这里有三种可能的情况:

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

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

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

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

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

于 2008-10-01T07:43:19.153 回答
0

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

如果本地计算机没有安装 IPv6,则从 GetHostEntry 方法的结果中过滤 IPv6 地址。因此,如果只有 IPv6 结果可用于地址参数,则有可能取回一个空的 IPHostEntry 实例。

返回的 IPHostEntry 实例的 Aliases 属性不会由此方法填充,并且始终为空。

于 2016-08-12T22:04:14.300 回答