【问题标题】:How to correctly compare host names如何正确比较主机名
【发布时间】:2011-11-16 12:30:51
【问题描述】:

我需要比较几个主机名并判断它们是否代表同一个主机,例如:

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;
    }

我没有包含主机地址数组的错误处理,但我不确定如果它会返回一个以上的地址该怎么办,这是否意味着它们将代表不同的机器?有没有更好的方法来比较它们?我需要检查这些主机是否指向同一台机器。

【问题讨论】:

  • 别忘了::10:0:0:0:0:0:0:1 ;p
  • 一个主机名可以有多个 IP 地址是正确的 - 考虑一台有 5 个网卡的 PC 的情况......请参阅support.microsoft.com/kb/110703 进行确认。
  • @RB - 很少有 5 个网卡只是将多个 IP 地址分配给单个连接。

标签: c# comparison host


【解决方案1】:

一般的答案是否定的,如果您有一台带有 2 个网卡的机器(例如),则无法确定它来自同一台机器,因为它实际上是 2 个不同的网络元素。

但是,您可以处理一些特殊情况,例如您提到的 localhost 与 127.0.0.1。

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

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

【讨论】:

  • 嗨@idnzalz,它不是一个网络应用程序,它是一个桌面应用程序,用户可以在其中为不同的服务器输入几个主机(ip 或 machineName),我需要分析它们并说出它们是否是是否在同一台机器上
  • “分析”是什么意思。他们是否安装了可以与之交谈的东西?你知道操作系统吗?如果是 Windows 机器,您可能可以通过 netbios 获取机器名称。你能控制/假设机器的配置吗?
  • 我能做的唯一假设是这些机器上安装了 Windows。根据两个主机是否代表同一台机器,我需要确保为它们提供相同的配置。但我不检查机器上安装了哪些软件。
  • 他们是从互联网还是局域网访问你?
  • 我相信 System.Net.Dns.GetHostAddresses 也是这样做的——它可以解析 netbios 名称。无论如何,我不能强迫人们只使用 netbios 名称(并且它在 vista、windows7 上不受支持)。但问题是 - 仅检查返回的 ip 地址中是否有任何匹配就足够了,或者我可能需要以另一种方式来做,比如尝试解析 ip 并比较返回的名称(我希望我最终不会比较 dns 名称带有 netbios 名称)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 2015-03-26
  • 1970-01-01
  • 2014-09-04
  • 2013-06-14
相关资源
最近更新 更多