我有一些在 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
}
}