我在这个答案上遇到了一段代码:Get IP address in a console application
using System;
using System.Net;
namespace ConsoleTest
{
class Program
{
static void Main()
{
String strHostName = string.Empty;
// Getting Ip address of local machine...
// First get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);
// Then using host name, get the IP address list..
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
for (int i = 0; i < addr.Length; i++)
{
Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
}
Console.ReadLine();
}
}
}
当我在本地运行以获取计算机的IP地址时,此代码正常工作。我要做的是使用代码获取网络服务器上的IP地址。所以基本上我尝试替换strHostName = Dns.GetHostName(); strHostName =“myServerName”;但它只返回一个IP。当我在服务器上运行程序时,我获得了分配给该服务器的所有IP。目标是在我的计算机上运行程序,从数据库表中读取服务器名称以获取超过100台服务器上的IP地址。我试图避免必须登录到每个服务器并在每个服务器上运行程序以获取IP地址。
有趣的是,代码适用于“www.google.com” - 这是服务器相关还是安全问题?
在我开始从数据库中获取数据之前,我需要让代码适用于一台服务器:)希望能更好地解释它。谢谢!
答案 0 :(得分:3)
您是否混淆了DNS使用这些方法尝试解析的名称与查找哪些IP地址实际绑定到您感兴趣的特定计算机上运行的TCP / IP协议堆栈之间的区别?如果您想知道机器实际配置的IP地址,无论在DNS中注册或不注册的内容,您都希望使用WMI来枚举计算机上配置的地址。
参见文章:WMI Query to get IP Address, Domain Name, OS Version
在上面的代码中,您只是询问运行代码的本地计算机,使用其配置的DNS解析程序并告诉您存在哪些条目作为您用于查询的名称的DNS记录。这就是为什么当您尝试查询www.google.com之类的内容时,您可以获得一个值。这是因为您只是在DNS中查找名称,因为这是一个可公开识别的名称,任何正确设置的DNS服务器都能够报告有效值。
这与IP地址绑定到服务器的方式非常不同。例如,考虑一个位于防火墙后面的服务器。服务器实际上可能正在使用内部网络本地的IP地址,这些地址映射到防火墙上的可公共访问的IP地址。在这种情况下,服务器知道的IP地址与其相应DNS条目中显示的公共IP地址完全不同。
答案 1 :(得分:0)
可能是服务器故意将其他IP排除在DNS之外。可以找到此功能的一个很好的示例in this KB Article (975808)。
尝试GetHostAddress()
并验证您获得的结果是否相同。请参阅MSDN:gethostaddress()
如果不这样做,您可能需要查看其他查询IP地址的方法。