使用Dns.GetHostEntry构造IPAddress变量

时间:2015-09-17 10:00:36

标签: c# dns ip

我的应用程序正在使用简单的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秒。

我进行了逐个参数检查,最终变量ip1ip2是相同的。鉴于Parse总是很快,并且我只使用标准的四个八位位组IPv4地址,是否有任何令人信服的理由使用Dns.GetHostEntry方法?如果我将来切换到Dns.GetHostEntry或命名主机IPv6,我可能需要FOOD.HALL.01吗?

1 个答案:

答案 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地址。