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

时间:2020-03-06 14:57:55  来源:igfitidea点击:

我只是想知道是否存在可以成功解析主机名但返回的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为非空,但是我不确定。

解决方案

我们在这里有三种可能的情况:

所以,不,我认为这不可能发生。

不,我们不会看到一个空的地址列表:即使查询确实存在但没有A或者AAAA(IPv6)记录的DNS标签,也会抛出SocketException("未知此类主机")。

我们可以通过查看.NET参考源发行版中DNS.cs中的函数InternalGetHostByName(string hostName,bool includeIPv6)进行验证。除了某些特定于平台的预防措施,DNS查找是围绕Winsock gethostbyname函数的简单包装。

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

在2012年5月的EDIT中,由响应提示无论如何都返回一个空列表:请注意,此答案仅适用于Win32,并且WinCE之类的平台的行为可能会大不相同。如果我们在Win32上看到"空列表"行为,并且请求是针对公开的DNS服务器的,请发布代码...

仅作记录。

感谢mdb接受的答案,我看了一下WSANO_DATA错误的描述:

The requested name is valid and was found in the database, but it does
  not have the correct associated data being resolved for. The usual example
  for this is a host name-to-address translation attempt (using gethostbyname or
  WSAAsyncGetHostByName) which uses the DNS (Domain Name Server). An MX record
  is returned but no A record—indicating the host itself exists, but is not
  directly reachable.

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