IPNetworkCollection.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Numerics;
  5. namespace Emby.Server.Implementations.Networking.IPNetwork
  6. {
  7. public class IPNetworkCollection : IEnumerable<IPNetwork>, IEnumerator<IPNetwork>
  8. {
  9. private BigInteger _enumerator;
  10. private byte _cidrSubnet;
  11. private IPNetwork _ipnetwork;
  12. private byte _cidr => this._ipnetwork.Cidr;
  13. private BigInteger _broadcast => IPNetwork.ToBigInteger(this._ipnetwork.Broadcast);
  14. private BigInteger _lastUsable => IPNetwork.ToBigInteger(this._ipnetwork.LastUsable);
  15. private BigInteger _network => IPNetwork.ToBigInteger(this._ipnetwork.Network);
  16. #if TRAVISCI
  17. public
  18. #else
  19. internal
  20. #endif
  21. IPNetworkCollection(IPNetwork ipnetwork, byte cidrSubnet)
  22. {
  23. int maxCidr = ipnetwork.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? 32 : 128;
  24. if (cidrSubnet > maxCidr)
  25. {
  26. throw new ArgumentOutOfRangeException(nameof(cidrSubnet));
  27. }
  28. if (cidrSubnet < ipnetwork.Cidr)
  29. {
  30. throw new ArgumentException("cidr");
  31. }
  32. this._cidrSubnet = cidrSubnet;
  33. this._ipnetwork = ipnetwork;
  34. this._enumerator = -1;
  35. }
  36. #region Count, Array, Enumerator
  37. public BigInteger Count
  38. {
  39. get
  40. {
  41. var count = BigInteger.Pow(2, this._cidrSubnet - this._cidr);
  42. return count;
  43. }
  44. }
  45. public IPNetwork this[BigInteger i]
  46. {
  47. get
  48. {
  49. if (i >= this.Count)
  50. {
  51. throw new ArgumentOutOfRangeException(nameof(i));
  52. }
  53. var last = this._ipnetwork.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6
  54. ? this._lastUsable : this._broadcast;
  55. var increment = (last - this._network) / this.Count;
  56. var uintNetwork = this._network + ((increment + 1) * i);
  57. var ipn = new IPNetwork(uintNetwork, this._ipnetwork.AddressFamily, this._cidrSubnet);
  58. return ipn;
  59. }
  60. }
  61. #endregion
  62. #region IEnumerable Members
  63. IEnumerator<IPNetwork> IEnumerable<IPNetwork>.GetEnumerator()
  64. {
  65. return this;
  66. }
  67. IEnumerator IEnumerable.GetEnumerator()
  68. {
  69. return this;
  70. }
  71. #region IEnumerator<IPNetwork> Members
  72. public IPNetwork Current => this[this._enumerator];
  73. #endregion
  74. #region IDisposable Members
  75. public void Dispose()
  76. {
  77. // nothing to dispose
  78. return;
  79. }
  80. #endregion
  81. #region IEnumerator Members
  82. object IEnumerator.Current => this.Current;
  83. public bool MoveNext()
  84. {
  85. this._enumerator++;
  86. if (this._enumerator >= this.Count)
  87. {
  88. return false;
  89. }
  90. return true;
  91. }
  92. public void Reset()
  93. {
  94. this._enumerator = -1;
  95. }
  96. #endregion
  97. #endregion
  98. }
  99. }