代码之家  ›  专栏  ›  技术社区  ›  VVS

dns.gethostentry是否可以返回地址列表为空的iphostentry?

  •  2
  • VVS  · 技术社区  · 16 年前

    我只是想知道是否存在主机名可以成功解析但返回的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要么在找不到主机名时抛出异常,要么地址列表不是空的,但我不确定。

    4 回复  |  直到 8 年前
        1
  •  1
  •   mdb    13 年前

    不,您将看不到空地址列表:即使您查询的DNS标签确实存在,但没有A或AAAA(IPv6)记录,也会引发socketException(“不知道这样的主机”)。

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

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

    编辑2012年5月,由声明仍然返回空列表的响应提示: 请注意,这个答案只适用于win32,而类似wince这样的平台可能表现得非常不同。如果您在win32上看到“空列表”行为,并且您的请求是针对公开可用的DNS服务器的,请发布您的代码…

        2
  •  1
  •   Community CDub    8 年前

    只是为了记录。

    多亏了MDB accepted answer 我看了一眼 description of the WSANO_DATA error :

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

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

        3
  •  0
  •   user17222    16 年前

    这里有三种可能的情况:

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

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

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

      • 异常被抛出,你永远无法到达那里。

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

        4
  •  0
  •   Nassar Nimer    8 年前

    答案是 . gethostentry方法查询DNS服务器上与IP地址关联的IP地址和别名。

    如果本地计算机没有安装IPv6,则从gethostentry方法的结果中筛选IPv6地址。因此,如果地址参数只有ipv6结果,则可以返回空的iphostentry实例。

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