我只是想知道是否存在主机名可以成功解析但返回的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是非空的,但我不确定。
答案 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)
这里有三种可能的情况:
主机名存在(DNS具有A记录)并解析为IP地址
主机名存在(DNS知道域名),但不存在A记录。
主机名不存在
所以不,我不认为这种情况会发生。
答案 3 :(得分:0)
答案是是。 GetHostEntry方法在DNS服务器中查询与IP地址关联的IP地址和别名。
如果本地计算机未安装IPv6,则会从GetHostEntry方法的结果中过滤掉IPv6地址。因此,如果只有IPv6结果可用于address参数,则可以返回一个空的IPHostEntry实例。
返回的IPHostEntry实例的Aliases属性未由此方法填充,并且始终为空。