Список IP всех адресов в подсети
Мне нужно получить все IP-адреса, содержащиеся в подсети, и я пытаюсь сделать это с помощью IP-сети
Например, подсеть 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
Как видите, это не желаемый результат. Что мне не хватает? Есть ли другой инструмент или метод, чтобы выполнить эту работу? Мне удалось что-то взломать, но это не красиво, и я не уверен, правильно ли он перечисляет большие подсети.
2 ответа
Решение
Библиотека 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<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
}
}