Список 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

Как видите, это не желаемый результат. Что мне не хватает? Есть ли другой инструмент или метод для выполнения этой работы? Мне удалось что-то взломать, но это некрасиво, и я не уверен, правильно ли он перечисляет большие подсети.


person Ray Womack    schedule 10.07.2010    source источник
comment
Похоже на ошибку в используемой вами библиотеке ipnetwork.   -  person John Weldon    schedule 10.07.2010
comment
Я надеялся зацепиться за кого-нибудь, кто использовал эту библиотеку в прошлом, без необходимости исправлять код этого парня ... Это дает много рекомендаций для людей, желающих создать подсети C #, так что я думаю, что ловил рыбу для исправления ;).   -  person Ray Womack    schedule 11.07.2010


Ответы (2)


Библиотека ipnetwork была обновлена ​​(до версии 1.3.1) патчем и тестовым модулем, покрывающим эту проблему. Его можно скачать по адресу IPnetwork.

person LukeSkywalker    schedule 22.07.2010
comment
Спасибо за обновления. Я рада принять твой ответ. Да, и библиотека работает отлично, большое спасибо за то, что сделали ее доступной. - person Ray Womack; 23.07.2010
comment
Пожалуйста. Я рад слышать о людях, которые его используют. С Уважением. - person LukeSkywalker; 23.07.2010

Я исправил код в классе IPAddressCollection. Теперь он покажет все IP-адреса в подсети, включая сеть, шлюз, широковещательную рассылку. Например, / 29 вернет ips .1–0.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
    }
}
person Ray Womack    schedule 12.07.2010