2010-07-10 18 views
6

ho bisogno di ottenere tutti gli indirizzi IP contenuti in all'interno di una sottorete e sto cercando di farlo utilizzando IPnetworkLista IP tutti gli indirizzi di una sottorete

Per esempio la sottorete 192.168.1.0/29 avrebbe il output seguente:

 // 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 

Ecco il mio codice:

 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 

Come si può vedere, questo non è il risultato desiderato. Cosa mi manca? C'è un altro strumento o metodo per fare questo lavoro? Sono riuscito a incidere qualcosa, ma non è bello e non sono sicuro se enumeri correttamente le sottoreti più grandi.

+7

heh il tuo rappresentante è 256 al momento di porre questa domanda :) –

+0

Questo sembra un bug nella libreria ipnetwork che stai usando. –

+0

Speravo di aggrapparmi a qualcuno che ha usato questa libreria in passato senza dover correggere il codice del ragazzo ...... Si ottengono molte raccomandazioni per le persone che vogliono fare subnetting C#, quindi suppongo che stavo pescando per il correzione;). –

risposta

8

biblioteca ipnetwork è stato aggiornato (alla versione 1.3.1) con la patch e un TestUnit che copre questo problema. Può essere scaricato al IPnetwork

+0

grazie per l'aggiornamento. Sono felice di accettare la tua risposta. Oh, e la biblioteca sta funzionando alla grande, grazie mille per averlo reso disponibile. –

+0

Prego. Sono contento di sapere delle persone che lo usano. Saluti. – LukeSkywalker

2

Ho corretto il codice nella classe IPAddressCollection. Ora mostrerà tutti gli indirizzi IP nella sottorete includendo rete, gateway, trasmissione. Ad esempio, a/29 restituirebbe ips .1 - .7.

Ecco la correzione modificata.

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 
    } 
} 
Problemi correlati