IPAddressCollection.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Numerics;
  4. namespace System.Net
  5. {
  6. public class IPAddressCollection : IEnumerable<IPAddress>, IEnumerator<IPAddress>
  7. {
  8. private IPNetwork _ipnetwork;
  9. private BigInteger _enumerator;
  10. internal IPAddressCollection(IPNetwork ipnetwork)
  11. {
  12. this._ipnetwork = ipnetwork;
  13. this._enumerator = -1;
  14. }
  15. #region Count, Array, Enumerator
  16. public BigInteger Count
  17. {
  18. get
  19. {
  20. return this._ipnetwork.Total;
  21. }
  22. }
  23. public IPAddress this[BigInteger i]
  24. {
  25. get
  26. {
  27. if (i >= this.Count)
  28. {
  29. throw new ArgumentOutOfRangeException("i");
  30. }
  31. byte width = this._ipnetwork.AddressFamily == Sockets.AddressFamily.InterNetwork ? (byte)32 : (byte)128;
  32. IPNetworkCollection ipn = this._ipnetwork.Subnet(width);
  33. return ipn[i].Network;
  34. }
  35. }
  36. #endregion
  37. #region IEnumerable Members
  38. IEnumerator<IPAddress> IEnumerable<IPAddress>.GetEnumerator()
  39. {
  40. return this;
  41. }
  42. IEnumerator IEnumerable.GetEnumerator()
  43. {
  44. return this;
  45. }
  46. #region IEnumerator<IPNetwork> Members
  47. public IPAddress Current
  48. {
  49. get { return this[this._enumerator]; }
  50. }
  51. #endregion
  52. #region IDisposable Members
  53. public void Dispose()
  54. {
  55. // nothing to dispose
  56. return;
  57. }
  58. #endregion
  59. #region IEnumerator Members
  60. object IEnumerator.Current
  61. {
  62. get { return this.Current; }
  63. }
  64. public bool MoveNext()
  65. {
  66. this._enumerator++;
  67. if (this._enumerator >= this.Count)
  68. {
  69. return false;
  70. }
  71. return true;
  72. }
  73. public void Reset()
  74. {
  75. this._enumerator = -1;
  76. }
  77. #endregion
  78. #endregion
  79. }
  80. }