2011-11-16 66 views
6

我有我需要比较,并告诉他们是否代表相同的主机,例如一些主机名:如何正确地比较主机名

localhost 
127.0.0.1 
machineName 

什么是做它在C#中最可靠的方法?现在我在做,像:

private bool CompareHosts(string host1, string host2) 
    { 
      UriBuilder builder1 = new UriBuilder(); 
      builder1.Host = Dns.GetHostAddresses(host1)[0].ToString(); 
      var uri1 = builder1.Uri; 

      UriBuilder builder2 = new UriBuilder(); 
      builder2.Host = Dns.GetHostAddresses(host2)[0].ToString(); 
      var uri2 = builder2.Uri; 

      return Uri.Compare(uri1, uri2, UriComponents.Host, 
        UriFormat.Unescaped, StringComparison.OrdinalIgnoreCase) == 0; 
    } 

我不包括错误处理的主机地址数组,但我不知道做什么,如果它会返回一个以上的地址,岂不是他们会代表不同的机器?有没有更好的方法来比较它们?我需要检查这些主机是否指向同一台机器。

+2

也请不要忘记':: 1'和'0:0:0:0:0:0:0:1'; p –

+0

单个主机名可以有多个IP地址是正确的 - 考虑大小写5网卡的PC的... 见http://support.microsoft.com/kb/110703确认。 –

+0

@RB - 少见的5个网卡只是多个IP地址已分配给单个连接。 –

回答

2

一般的答案是否定的,如果你有一台机器2个网卡(例如),有知道它来自同一台机器没有肯定的方式,因为它确实是2个不同的网络元素。

但是,你可以处理一些特殊情况下,像你提到的本地主机与127.0.0.1。

当你从DNS查询多个IP地址通常意味着机器是不一样的,因为这种技术通常用于不同的机器之间的负载平衡。

过去有很多黑客技术可以发现2ip是否是同一台机器,在某些情况下,您可以获得机器的内部时间,或者如果它以连续的顺序打开端口,您也可以使用它。但我强烈建议不要这样。如果不进行此项检查,可能会更好地实现您的目标(例如,如果您有Web应用程序,则可以轻松使用此cookie)。再次,需要更多的上下文来帮助。

+0

嗨@idanzalz,它不是一个Web应用程序,它的桌面应用程序,用户可以输入不同的服务器一对夫妇的主机(IP或者机器名),我需要分析他们说,如果他们是在同一台机器上或不 – username

+0

“分析”是什么意思?他们是否有安装的东西可以与之交谈?你知道操作系统吗?如果它是一台Windows机器,您可能可以通过netbios获取机器名称。你能控制/假定机器配置上的任何东西吗? – idanzalz

+0

我可以做的唯一假设是这些机器上安装了窗口。根据两台主机是否代表同一台计算机,我需要确保为它们提供相同的配置。但我不检查机器上安装了哪些软件。 – username