2008-10-01 57 views
2

我只是想知道是否有可以成功解析主机名但返回的hostEntry.AddressList为空的情况。Dns.GetHostEntry是否会返回一个IPHostEntry和一个空的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中不为空,但我不知道关于那个。

回答

1

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

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

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

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

+3

这似乎并不严格。现在我正在努力解决一个IPHostEntry返回一个空的地址列表和主机名为“26l2233b1-04”的问题。目前我不知道为什么会发生这种情况...... – 2010-06-22 12:52:11

0

你这里有三种可能的情况:

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

    • 条件是从不打
  2. 主机名存在(DNS知道域),但是不存在A记录。

    • 这是一个极其不可能的情况,我认为这绝不会发生在第一位。
  3. 主机名不存在

    • 抛出异常,你永远不会有。

所以,不,我不认为能不会发生。

+0

存在DNS标签('主机名')但不存在A记录的情况实际上很常见:请考虑MX记录。 – mdb 2008-10-01 08:03:49

1

只用于记录。

感谢MDB的accepted answer我接过一看description of the WSANO_DATA error

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

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

0

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

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

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

相关问题