Dns.GetHostEntry可以返回一个带有空AddressList的IPHostEntry吗?

时间:2008-10-01 07:34:43

标签: c# dns

我只是想知道是否存在主机名可以成功解析但返回的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 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

仅供记录。

感谢mdb的accepted answer我看了description of the WSANO_DATA error

  

请求的名称有效且在数据库中找到,但确实如此   没有正确的关联数据被解析。通常的例子   这是一个主机名称到地址的转换尝试(使用gethostbyname或   WSAAsyncGetHostByName)使用DNS(域名服务器)。 MX记录   返回,但没有A记录 - 表明主机本身存在,但不是   可以直接到达。

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

答案 2 :(得分:0)

这里有三种可能的情况:

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

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

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

    • 抛出异常,你永远不会到达那里。
  4. 所以不,我不认为这种情况会发生。

答案 3 :(得分:0)

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

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

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