我的应用程序正在使用简单的IPv4
地址向网络上的另一个应用程序(维护报告数据库)发送报告。我可以通过两种方式构建有效的IPAddress
:
string address = "200.1.2.41";
IPAddress ip1 = IPAddress.Parse(address);
IPAddress ip2 = (Dns.GetHostEntry(address)).AddressList[0];
如果address
表示可以访问的IP,则两种方法都很快(尽管IPAddress.Parse
最快)。但是如果address
无法访问(例如,服务器已关闭或用户在设置中输入了错误的IP),则Parse快速闪电......但Dns.GetHostEntry
最多可挂起9秒。
我进行了逐个参数检查,最终变量ip1
和ip2
是相同的。鉴于Parse总是很快,并且我只使用标准的四个八位位组IPv4
地址,是否有任何令人信服的理由使用Dns.GetHostEntry
方法?如果我将来切换到Dns.GetHostEntry
或命名主机IPv6
,我可能需要FOOD.HALL.01
吗?
答案 0 :(得分:1)
如果您只想为您的IP地址字符串表示获取IPAddress
的实例,那么使用DNS来实现此目的是绝对的过度杀伤。
各种超时,延迟等都是绝对预期的。至少与IPAddress.Parse()
中发生的字符串表示的纯粹本地解析和处理相比。这样做是,要求DNS服务器将IP地址字符串解析为主机名"条目"。从那里你可以得到你一直都知道的IP地址(尽管是string
而不是IPAddress
)。
现在,如果你想能够转换"将来主机名称转换为IP地址,然后是,您需要通过DNS。
但你总是可以这样做(概念上):
// First see if it is a valid IP address rep - fast.
IPAddress ip;
if (!IPAddress.TryParse(address, out ip))
{
// See if it is a hostname - slower.
ip = Dns.GetHostEntry(address).AddressList[0];
}
是的,IPAddress.TryParse()
(或Parse()
)可以处理IPv4和IPv6地址。