在MSDN上提及GetHostByName
已过时。替换为GetHostEntry
。它们有什么区别?
答案 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.GetHostEntry
和Dns.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