任何人都可以想到一个简单的方法来告诉在win32或.NET如果主机名(字符串)解析为本地计算机?如:如何测试主机名是否指本地机器
"myhostname"
"myhostname.mydomain.local"
"192.168.1.1"
"localhost"
这个练习的目标是产生一个测试,这将告诉我们,如果Windows安全层将把访问机器的本地或网络
任何人都可以想到一个简单的方法来告诉在win32或.NET如果主机名(字符串)解析为本地计算机?如:如何测试主机名是否指本地机器
"myhostname"
"myhostname.mydomain.local"
"192.168.1.1"
"localhost"
这个练习的目标是产生一个测试,这将告诉我们,如果Windows安全层将把访问机器的本地或网络
在.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;
}
}
}
}
}
您可以通过编写Dns.Resolve(hostName).AddressList[0].ToString()
得到该主机名解析的IP地址。
然后,您可以将其与127.0.0.1
或计算机的本地IP地址进行比较。
您可以通过循环System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList
来获得计算机的本地IP地址。
这个问题已经回答了,但这里是我想出了解决主机名和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)));
}
我稍微更新的解决方案,从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;
}
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