我需要获取子网中包含的所有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
如您所见,这不是理想的结果。我错过了什么?是否有其他工具或方法来完成这项工作?我已经设法破解了一些东西,但它并不漂亮,我不确定它是否正确枚举了更大的子网。
答案 0 :(得分:8)
ipnetwork库已经更新(到版本1.3.1),其中包含补丁和测试单元,可以解决此问题。 它可以在IPnetwork
下载答案 1 :(得分:2)
我修复了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<IPAddress>, IEnumerator<IPAddress>
{
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<IPAddress> IEnumerable<IPAddress>.GetEnumerator()
{
return this;
}
IEnumerator IEnumerable.GetEnumerator()
{
return this;
}
#region IEnumerator<IPNetwork> 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
}
}