/// <summary> /// Creates a peer address from a continuous byte array. This is useful if you don't know the size beforehand. /// The new offset can be accessed through the Offset property. /// </summary> /// <param name="me">The serialized array.</param> /// <param name="initialOffset">The offset where to start.</param> public PeerAddress(sbyte[] me, int initialOffset) { // get the peer ID, this is independent of the type long offset = initialOffset; // get the options int options = me[offset++] & Utils.Utils.MaskFf; IsIPv6 = (options & Net6) > 0; // TODO static methods could be used instead IsFirewalledUdp = (options & FirewallUdp) > 0; IsFirewalledTcp = (options & FirewallTcp) > 0; IsRelayed = (options & Relayed) > 0; // get the relays int relays = me[offset++] & Utils.Utils.MaskFf; // first 3 bits are the size RelaySize = (relays >> TypeBitSize) & Mask07; // last 5 bits indicate if IPv6 or IPv4 var b = (byte)(relays & Mask1F); // TODO check if works (2x) _relayType = new BitArray(b); // get the ID var tmp = new sbyte[Number160.ByteArraySize]; Array.Copy(me, offset, tmp, 0, Number160.ByteArraySize); PeerId = new Number160(tmp); offset += Number160.ByteArraySize; PeerSocketAddress = PeerSocketAddress.Create(me, IsIPv4, offset); offset = PeerSocketAddress.Offset; if (RelaySize > 0) { PeerSocketAddresses = new List <PeerSocketAddress>(RelaySize); for (int i = 0; i < RelaySize; i++) { var psa = PeerSocketAddress.Create(me, !_relayType.Get(i), offset); PeerSocketAddresses.Add(psa); offset = psa.Offset; } } else { PeerSocketAddresses = EmptyPeerSocketAddresses; } Size = offset - initialOffset; Offset = offset; _hashCode = PeerId.GetHashCode(); }
/// <summary> /// Creates a peer address from a byte buffer. /// </summary> /// <param name="buffer">The channel buffer to read from.</param> public PeerAddress(AlternativeCompositeByteBuf buffer) { long readerIndex = buffer.ReaderIndex; // get the type int options = buffer.ReadByte(); IsIPv6 = (options & Net6) > 0; IsFirewalledUdp = (options & FirewallUdp) > 0; IsFirewalledTcp = (options & FirewallTcp) > 0; IsRelayed = (options & Relayed) > 0; // get the relays int relays = buffer.ReadByte(); RelaySize = (relays >> TypeBitSize) & Mask07; var b = (byte)(relays & Mask1F); // TODO check if works (2x) _relayType = new BitArray(b); // get the ID var me = new sbyte[Number160.ByteArraySize]; buffer.ReadBytes(me); PeerId = new Number160(me); PeerSocketAddress = PeerSocketAddress.Create(buffer, IsIPv4); if (RelaySize > 0) { PeerSocketAddresses = new List <PeerSocketAddress>(RelaySize); for (int i = 0; i < RelaySize; i++) { PeerSocketAddresses.Add(PeerSocketAddress.Create(buffer, !_relayType.Get(i))); } } else { PeerSocketAddresses = EmptyPeerSocketAddresses; } Size = buffer.ReaderIndex - readerIndex; Offset = -1; // not used here _hashCode = PeerId.GetHashCode(); }