2009-12-24 101 views
9

任何人都可以想到一个简单的方法来告诉在win32或.NET如果主机名(字符串)解析为本地计算机?如:如何测试主机名是否指本地机器

"myhostname" 
"myhostname.mydomain.local" 
"192.168.1.1" 
"localhost" 

这个练习的目标是产生一个测试,这将告诉我们,如果Windows安全层将把访问机器的本地或网络

回答

7

在.NET中,您可以:

IPHostEntry iphostentry = Dns.GetHostEntry (Dns.GetHostName()); 

然后,对于任何主机名,请检查它是否解析为iphostEntry.AddressList(这是IPAddress [])中的一个IP。

下面是一个完整的程序,将检查在命令行中传递的主机名/ IP地址:

using System; 
using System.Net; 

class Test { 
    static void Main (string [] args) 
    { 
     IPHostEntry iphostentry = Dns.GetHostEntry (Dns.GetHostName()); 
     foreach (string str in args) { 
      IPHostEntry other = null; 
      try { 
       other = Dns.GetHostEntry (str); 
      } catch { 
       Console.WriteLine ("Unknown host: {0}", str); 
       continue; 
      } 
      foreach (IPAddress addr in other.AddressList) { 
       if (IPAddress.IsLoopback (addr) || Array.IndexOf (iphostentry.AddressList, addr) != -1) { 
        Console.WriteLine ("{0} IsLocal", str); 
        break; 
       } 
      } 
     } 
    } 
} 
+1

Tis的工作,虽然它似乎不测试像“127.0.0.1”地址。这一个工程(随意更新您的帖子,如果你的意见): var local_ip =(从ip在Dns.GetHostEntry(Dns.GetHostName())。AddressList select ip).ToList(); local_ip.Add(IPAddress.Loopback); local_ip.Add(IPAddress.IPv6Loopback); var target_ip = Dns.GetHostEntry(target).AddressList; var intersect = from ip1 in target_ip join ip2 in local_ip on ip1等于ip2 select ip1; return intersect.Any(); – galets 2009-12-24 18:38:36

1

您可以通过编写Dns.Resolve(hostName).AddressList[0].ToString()得到该主机名解析的IP地址。

然后,您可以将其与127.0.0.1或计算机的本地IP地址进行比较。

您可以通过循环System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList来获得计算机的本地IP地址。

0

在.net中,您应该可以使用Request.ServerVariables(“REMOTE_ADDR”);获取主机IP地址,然后将其与主机名解析的IP地址进行比较。这不是你想要的吗?

+0

这只适用于ASP.NET应用程序。 – Gonzalo 2009-12-24 17:54:02

+0

这只有在ASP.Net请求期间才有效。另外,你应该使用'Request.UserHostAddress'。 – SLaks 2009-12-24 17:54:34

3

这个问题已经回答了,但这里是我想出了解决主机名和IP地址:

public static bool IsLocalHost(string host) 
{ 
    IPHostEntry localHost = Dns.GetHostEntry(Dns.GetHostName()); 

    IPAddress ipAddress = null; 

    if (IPAddress.TryParse(host, out ipAddress)) 
     return localHost.AddressList.Any(x => x.Equals(ipAddress)); 

    IPHostEntry hostEntry = Dns.GetHostEntry(host); 

    return localHost.AddressList.Any(x => hostEntry.AddressList.Any(y => x.Equals(y))); 
} 
1

我稍微更新的解决方案,从PhilDulac,首先检查本地主机与一些别名别名在hosts/etc中定义,其他部分是PhilDulac的解决方案。

public static bool IsLocalHost(Uri uri) 
{ 
    bool isLocalhost = false; 
    string hostName = uri.Host; 

    IPHostEntry localhost = Dns.GetHostEntry("127.0.0.1"); 
    if (uri.Host == localhost.HostName) 
    { 
     IPHostEntry hostEntry = Dns.GetHostEntry(hostName); 
     isLocalhost = hostEntry.AddressList.Any(IPAddress.IsLoopback); 
    } 

    if (!isLocalhost) 
    { 
     localhost = Dns.GetHostEntry(Dns.GetHostName()); 

     IPAddress ipAddress = null; 

     if (IPAddress.TryParse(hostName, out ipAddress)) 
      isLocalhost = localhost.AddressList.Any(x => x.Equals(ipAddress)); 

     if (!isLocalhost) 
     { 
      try 
      { 
       var hostEntry = Dns.GetHostEntry(hostName); 
       isLocalhost = localhost.AddressList.Any(x => hostEntry.AddressList.Any(x.Equals)); 
      } 
      catch (SocketException e) 
      { 
       Debug.WriteLine(e); 
      } 
     } 
    } 

    return isLocalhost; 
} 
+0

不错的尝试,但缺少ipv6的支持:) – galets 2014-11-25 18:16:25

+0

你有没有真正的例子,它与ipv6失败? – psulek 2014-11-26 08:23:48

+0

':: 1'是ipv6中的本地主机。你正在测试'127.0.0.1',这是ipv4本地主机,但不是':: 1' – galets 2014-11-29 20:14:30