2

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

1 回答 1

2

skipassource旨在不在 DNS 名称系统中包含 IP 地址,因此我认为您必须找到另一种方法Dns.GetHostEntry

您是否尝试查看 System.Net.NetworkInformation 命名空间?

GetAllNetworkInterfaces我认为,如果您通过then 调用遍历适配器GetIPProperties以获取适配器的 IP 属性,然后检查UnicastAddresses您可以构建 IP 地址列表。虽然没有测试。

另请参阅:http: //msdn.microsoft.com/de-de/library/system.net.networkinformation.networkinterface.getallnetworkinterfaces.aspx

于 2012-03-30T15:02:52.093 回答