GetHostEntry和GetHostByName之间的区别?

时间:2012-02-28 05:33:03

标签: c# dns gethostbyname

MSDN上提及GetHostByName已过时。替换为GetHostEntry。它们有什么区别?

2 个答案:

答案 0 :(得分:8)

看起来GetHostEntry会进行更多错误检查并支持Network Tracing

GetHostByName已解压缩:

public static IPHostEntry GetHostByName(string hostName)
{
  if (hostName == null)
    throw new ArgumentNullException("hostName");
  Dns.s_DnsPermission.Demand();
  IPAddress address;
  if (IPAddress.TryParse(hostName, out address))
    return Dns.GetUnresolveAnswer(address);
  else
    return Dns.InternalGetHostByName(hostName, false);
}

GetHostEntry已解压缩:

public static IPHostEntry GetHostEntry(string hostNameOrAddress)
{
  if (Logging.On)
    Logging.Enter(Logging.Sockets, "DNS", "GetHostEntry", hostNameOrAddress);
  Dns.s_DnsPermission.Demand();
  if (hostNameOrAddress == null)
    throw new ArgumentNullException("hostNameOrAddress");
  IPAddress address;
  IPHostEntry ipHostEntry;
  if (IPAddress.TryParse(hostNameOrAddress, out address))
  {
    if (((object) address).Equals((object) IPAddress.Any) || ((object) address).Equals((object) IPAddress.IPv6Any))
      throw new ArgumentException(SR.GetString("net_invalid_ip_addr"), "hostNameOrAddress");
    ipHostEntry = Dns.InternalGetHostByAddress(address, true);
  }
  else
    ipHostEntry = Dns.InternalGetHostByName(hostNameOrAddress, true);
  if (Logging.On)
    Logging.Exit(Logging.Sockets, "DNS", "GetHostEntry", (object) ipHostEntry);
  return ipHostEntry;
}

答案 1 :(得分:0)

首先,重要的是要认识到它们是UNIX套接字库的包装,它公开了函数inet_aton(相当于IPAddress.Parse),gethostbyname(由{{1}包装) }和Dns.GetHostByName(由gethostbyaddr包装)。微软随后基于这些功能添加了Dns.GetHostByAddress实用程序功能。

考虑了Dns.GetHostEntryDns.GetHostByName之间的哲学差异之后,我得出的结论是,Microsoft决定他们为DNS查找公开的主要API应该尝试仅返回 actual DNS条目

在UNIX套接字级别,Dns.GetHostEntry可以使用IP地址或主机名。如果您提供的,则明确记录为解析IP地址。但是,它也明确记录为仅支持IPv4地址。因此,鼓励开发人员改用函数gethostbyname,该函数进行的查找更复杂,涉及到您也要连接的服务,并且支持IPv4以外的地址族。

Microsoft在包装程序中采用了不同的方法。他们仍然认为getaddrinfo已过时,但他们决定创建一个函数来返回您要求的实际物理DNS主机条目,而不是将查询与服务数据库绑定在一起。仅提供一个包含有效地址的字符串是不够的,如果没有DNS条目,那么GetHostByName将会失败,因为这是它的全部目的。因此,如果将主机名传递给GetHostEntry,它将执行正向DNS查找,如果将IP地址传递给GetHostEntry,则将执行反向DNS查找。无论哪种方式,返回的结构都将告诉您DNS条目名称和关联的地址-但是,如果没有关联的条目,则唯一得到的就是错误。

如果您要处理提供连接目标的用户输入,GetHostEntry确实不适合,因为如果用户键入一个临时IP地址,即使它可能无法解析它,由于它是IP地址,因此您拥有连接所需的一切。在这种情况下,GetHostEntry正是您需要的功能,但是Microsoft已选择弃用它。鉴于已弃用,习惯用法将是复制@Faisai Mansoor在反编译的GetHostByName函数中显示的“尝试先解析”方法:

GetHostByName

这使用了// Microsoft's internal code for GetHostByName: if (IPAddress.TryParse(hostName, out address)) return Dns.GetUnresolveAnswer(address); else return Dns.InternalGetHostByName(hostName, false); 类的内部实现细节,但是很容易在您自己的代码中复制它的精神,例如:

Dns