列出IP子网中的所有地址

我需要获取子网中包含的所有IP地址,我正在尝试使用IPnetwork

例如,子网192.168.1.0/29将具有以下输出:

// Output // 192.168.1.0 // 192.168.1.1 // 192.168.1.2 // 192.168.1.3 // 192.168.1.4 // 192.168.1.5 // 192.168.1.6 // 192.168.1.7 

这是我的代码:

  IPNetwork ipn = IPNetwork.Parse("192.168.1.0/29"); IPAddressCollection ips = IPNetwork.ListIPAddress(ipn); foreach (IPAddress ip in ips) { Console.WriteLine(ip); } // Output // 192.168.1.0 // 192.168.1.0 // 192.168.1.0 // 192.168.1.0 // 192.168.1.0 // 192.168.1.0 

如您所见,这不是理想的结果。 我错过了什么? 有没有其他工具或方法来完成这项工作? 我已经设法破解了一些东西,但它并不漂亮,我不确定它是否正确枚举更大的子网。

ipnetwork库已经更新(到版本1.3.1),其中包含补丁和测试单元,可以解决此问题。 它可以在IPnetwork下载

我修复了IPAddressCollection类中的代码。 它现在将显示子网中的所有IP地址,包括网络,网关,广播。 例如,/ 29将返回ips .1 – .7。

这是修正后的修复。

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Collections; namespace LukeSkywalker.IPNetwork { public class IPAddressCollection : IEnumerable, IEnumerator { private IPNetwork _ipnetwork; private double _enumerator; internal IPAddressCollection(IPNetwork ipnetwork) { this._ipnetwork = ipnetwork; this._enumerator = -1; } #region Count, Array, Enumerator public double Count { get { // return this._ipnetwork.Usable; return this._ipnetwork.Usable + 2; } } public IPAddress this[double i] { get { if (i >= this.Count) { throw new ArgumentOutOfRangeException("i"); } IPNetworkCollection ipn = IPNetwork.Subnet(this._ipnetwork, 32); // return ipn[0].Network; return ipn[i].Network; } } #endregion #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() { return this; } IEnumerator IEnumerable.GetEnumerator() { return this; } #region IEnumerator Members public IPAddress Current { get { return this[this._enumerator]; } } #endregion #region IDisposable Members public void Dispose() { // nothing to dispose return; } #endregion #region IEnumerator Members object IEnumerator.Current { get { return this.Current; } } public bool MoveNext() { this._enumerator++; if (this._enumerator >= this.Count) { return false; } return true; } public void Reset() { this._enumerator = -1; } #endregion #endregion } }