GetHostEntry和GetHostByName之间的区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

MSDN上,它提到GetHostByName已经过时了。替换是GetHostEntry。它们有什么区别?

提问于
用户回答回答于

看起来GetHostEntry会进行更多错误检查,并且还支持网络跟踪

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;
}
用户回答回答于

首先,重要的是要认识到这些是UNIX套接字库的包装器,它暴露了函数inet_aton(等价于IPAddress.Parse),gethostbyname(包装Dns.GetHostByName)和gethostbyaddr(包装Dns.GetHostByAddress)。Microsoft随后Dns.GetHostEntry根据这些添加了实用程序功能。

在思考了Dns.GetHostByName和之间的哲学差异之后Dns.GetHostEntry,我得出结论,微软决定他们为DNS查找公开的主要API应该只尝试返回实际的DNS条目

在UNIX套接字级别,gethostbyname可以使用IP地址或主机名。如果您提供的是IP地址,则明确记录为解析IP地址。但它也明确记录为仅支持IPv4地址。因此,鼓励开发人员使用该功能getaddrinfo,这样可以执行更复杂的查找,包括您要连接的服务,并且支持IPv4以外的地址系列。

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

如果您正在寻找处理提供连接目标的用户输入,GetHostEntry则不太合适,因为如果用户键入ad hoc IP地址,即使它是IP地址,也可能无法解析它,因为您建立连接所需的一切。GetHostByName正是这种情况下你需要的功能,但微软选择弃用它。鉴于弃用,成语将是复制@Faisai Mansoor在反编译GetHostByName函数中显示的“尝试先解析”方法:

// Microsoft's internal code for GetHostByName:
if (IPAddress.TryParse(hostName, out address))
  return Dns.GetUnresolveAnswer(address);
else
  return Dns.InternalGetHostByName(hostName, false);

这使用了Dns类的内部实现细节,但它的精神很容易在您自己的代码中复制,例如:

if (!IPAddress.TryParse(userInput, out var addressToWhichToConnect))
  addressToWhichToConnect = Dns.GetHostEntry(userInput).AddressList.First();

所属标签

可能回答问题的人

  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问5 回答
  • Dingda

    Dingda · 站长 (已认证)

    4 粉丝0 提问3 回答
  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问3 回答
  • 螃蟹居

    1 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券