2010-07-10 25 views
6

que necesito para obtener todas las direcciones IP contenidas en dentro de una subred y yo estoy tratando de hacerlo utilizando IPnetworkIP todas las direcciones en una subred

Por ejemplo la subred 192.168.1.0/29 tendría la siguiente resultado:

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

Aquí está mi código:

 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 

Como se puede ver, este no es el resultado deseado. ¿Qué me estoy perdiendo? ¿Hay alguna otra herramienta o método para hacer este trabajo? Me las arreglé para hackear algo, pero no es bonito y no estoy seguro de si está enumerando correctamente las subredes más grandes.

+7

heh su representante es 256 al momento de hacer esta pregunta :) –

+0

Esto parece un error en la biblioteca de ipnetwork que está utilizando. –

+0

Tenía la esperanza de conectarme con alguien que haya usado esta biblioteca en el pasado sin tener que corregir el código del tío ...... Recibo muchas recomendaciones para la gente que quiere hacer subredes en C#, así que supongo que estaba pescando para el arreglar;). –

Respuesta

8

biblioteca de ipnetwork se ha actualizado (a la versión 1.3.1) con parche y una unidad de prueba que cubren este problema. Se puede descargar en IPnetwork

+0

gracias por la actualización. Estoy feliz de aceptar tu respuesta. Ah, y la biblioteca funciona muy bien, muchas gracias por ponerla a disposición. –

+0

De nada. Me alegra saber de personas que lo usan. Saludos. – LukeSkywalker

2

He reparado el código en la clase IPAddressCollection. Ahora mostrará todas las direcciones IP en la subred, incluida la red, la puerta de enlace y la difusión. Por ejemplo, a/29 devolvería ips .1 - .7.

Aquí está la corrección corregida.

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