我有一些现有的代码在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
命令netsh int ipv4 add address
并指定了skipassource=true
标志。
有没有办法在我的查询中包含这些地址,即返回服务器上的所有地址?
(如果你很好奇, skipassource=true
标志被设置,因为Windows 2008在networking中引入了新的行为,允许它决定你认为哪个IP地址是“主要的”,其余的应用程序依赖于我们能够select主要的。在Windows 2008中唯一的方法是将所有其他地址标记为skipassource=true
。)
编辑这个问题现在只是为了满足我的好奇心,因为我已经解决了这个问题。 我上面的原始代码是用来运行在服务器上的所有IP,看看它是否find一个匹配我正在寻找一个特定的IP。 我现在检查一下,看看我所在的服务器是否已经在运行一个监听特定IP地址/端口的服务,所以我不再需要遍历所有的IP。 但是,如果对原始问题有答案,我还是有兴趣的。
编辑感谢@aKzenT的解决scheme。 我现在使用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属性,然后检查你可以建立一个IP地址列表的UnicastAddresses
。 虽然没有测试过。
另请参阅: http : //msdn.microsoft.com/de-de/library/system.net.networkinformation.networkinterface.getallnetworkinterfaces.aspx