예제 #1
0
        /// <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();
        }
예제 #2
0
        /// <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();
        }