我有一些在Windows 2003下运行良好的现有代码,以获取绑定到服务器的IP地址列表:
foreach (IPAddress addr in (Dns.GetHostEntry(Dns.GetHostName())).AddressList)
{
// Code here to act on each address
}
当我在Windows 2008服务器上运行此代码时,它只返回一个IP地址。经过进一步调查,似乎机器正在侦听的所有其余IP地址都是使用netsh int ipv4 add address
命令并指定skipassource=true
标志添加的。
有没有办法在我的查询中包含这些地址,即返回服务器上的所有地址?
(如果您感到好奇,skipassource=true
标志已设置,因为Windows 2008在网络中引入了新行为,允许它决定它认为哪些IP地址为“主要”,而其他应用程序依赖我们能够选择主要版本。在Windows 2008中执行此操作的唯一方法是将所有其他地址标记为skipassource=true
。)
编辑这个问题现在只是为了满足我的好奇心,因为我已经解决了这个问题。我上面的原始代码用于运行服务器上的所有IP,并查看它是否找到了我正在寻找的特定IP的匹配项。我现在检查我所在的服务器是否已经在运行侦听该特定IP地址/端口的服务,因此我不再需要遍历所有IP。不过,我仍有兴趣听听是否有原始问题的答案。
编辑感谢@aKzenT提供解决方案。我现在使用NetworkInteface.GetAllNetworkInterfaces()
来访问所有IP,而不是Dns.GetHostEntry()
。我的最终代码如下所示:
foreach (NetworkInterface netface in NetworkInterface.GetAllNetworkInterfaces())
{
foreach (UnicastIPAddressInformation uni in netface.GetIPProperties().UnicastAddresses)
{
IPAddress addr = uni.Address;
// Code here to act on each address
}
}
答案 0 :(得分:2)
skipassource
旨在不在DNS名称系统中包含IP地址,因此我认为您必须找到另一种方式而不是Dns.GetHostEntry
您是否尝试过查看System.Net.NetworkInformation命名空间?
我认为如果您通过GetAllNetworkInterfaces
遍历适配器,然后调用GetIPProperties
以获取适配器的IP属性,然后检查UnicastAddresses
您是否可以构建IP地址列表。虽然没经过测试。