c# - 如何获取 Windows 2008 和 .NET 中包含 "skipassource"地址的系统 IP 地址列表?

标签 c# .net windows windows-server-2008-r2 windows-networking

我有一些在 Windows 2003 下运行良好的现有代码,用于获取绑定(bind)到服务器的 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
    }
}

最佳答案

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

之外的另一种方法

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

我认为,如果您通过 GetAllNetworkInterfaces 循环访问适配器,然后调用 GetIPProperties 来获取适配器的 IP 属性,然后检查 UnicastAddresses您可以建立一个 IP 地址列表。但尚未测试。

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

关于c# - 如何获取 Windows 2008 和 .NET 中包含 "skipassource"地址的系统 IP 地址列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9934619/

相关文章:

c# - 根据标题长度调整窗口大小。

c# - 释放互斥锁

c# listview 类 - 锁定调整列大小的可能性

c# - Visual Studio 2008/2010 错误/问题列表

c# - 如何判断操作系统是 Windows XP 还是更高版本?

c# - 通用委托(delegate)

c# - C#中的无锁优先级队列

C# 和反射

使用 Windows api 在控制台中居中文本?

Python 新手 : pip install and syntax problems