2010-07-10 6 views
6

Ich brauche alle IP-Adressen in einem Subnetz innerhalb enthalten sind, zu bekommen, und ich versuche, es zu tun mit IPnetworkListe IP alle Adressen in einem Subnetz

Zum Beispiel das Subnetz 192.168.1.0/29 das hätte folgende Ausgabe:

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

Hier ist mein Code:

 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 

Wie Sie sehen können, ist dies nicht das gewünschte Ergebnis. Was vermisse ich? Gibt es ein anderes Werkzeug oder eine andere Methode, um diese Aufgabe zu erledigen? Ich habe es geschafft, etwas zu hacken, aber es ist nicht schön und ich bin mir nicht sicher, ob es größere Subnetze richtig aufzählt.

+7

heh Ihre rep ist 256 zum Zeitpunkt der Frage diese Frage :) –

+0

Dies sieht aus wie ein Fehler in der ipnetwork-Bibliothek, die Sie verwenden. –

+0

Ich hatte gehofft, mich an jemanden zu klammern, der diese Bibliothek in der Vergangenheit benutzt hat, ohne den Code des Kerls reparieren zu müssen ... Er bekommt viele Empfehlungen für Leute, die C# Subnetting machen wollen, also glaube ich, dass ich für die fixieren;). –

Antwort

8

Die ipnetwork-Bibliothek wurde aktualisiert (auf Version 1.3.1) mit Patch und einer Testeinheit, die dieses Problem abdeckt. Es kann heruntergeladen werden um IPnetwork

+0

danke für das Update. Ich bin froh, deine Antwort zu akzeptieren. Oh, und die Bibliothek funktioniert großartig, vielen Dank für die Bereitstellung. –

+0

Gern geschehen. Ich bin froh, von Leuten zu hören, die es benutzen. Grüße. – LukeSkywalker

2

Ich habe den Code in der IPAddressCollection-Klasse behoben. Es zeigt nun alle IP-Adressen im Subnetz an, einschließlich Netzwerk, Gateway, Broadcast. Zum Beispiel würde a/29 ips .1 - .7 zurückliefern.

Hier ist der korrigierte Fix.

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