列出子网中的所有 IP 地址

Posted

技术标签:

【中文标题】列出子网中的所有 IP 地址【英文标题】:List IP all addresses in a subnet 【发布时间】:2011-03-14 06:46:34 【问题描述】:

我需要获取子网中包含的所有 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 库中的一个错误。 我希望能找到过去使用过这个库的人,而不必修复这个人的代码......对于想要做 c# 子网划分的人来说,它得到了很多建议,所以我想我是在钓鱼;)。 【参考方案1】:

ipnetwork 库已更新(至版本 1.3.1),其中包含涵盖此问题的补丁和测试单元。 可以在IPnetwork下载

【讨论】:

感谢您的更新。我很高兴接受你的回答。哦,图书馆运行良好,非常感谢您提供它。 不客气。我很高兴听到人们使用它。问候。【参考方案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
    

【讨论】:

以上是关于列出子网中的所有 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

子网掩码与ip地址的关系

子网掩码及子网划分

如何使用 Java 获取连接在同一网络(子网)中的 IP 列表

从 JS 中的子网生成随机 IP 地址

我应该在 Azure *** 中使用网关子网中的 IP 地址吗?

将IP地址匹配到子网掩码表中……Java的最佳方法是什么?