예제 #1
0
        private bool ParseBitfield(PeerEventData peerEventData)
        {
            var byteBitsList = peerEventData.Payload.Select(b => new BitArray(new byte[] { b }));

            if (byteBitsList.Count() * 8 < PieceAmount - 1)
            {
                return(false);
            }

            long pieceIndex = 0;

            foreach (var byteBits in byteBitsList)
            {
                for (int byteIndex = 7; byteIndex >= 0; byteIndex--)
                {
                    if (pieceIndex >= PieceAmount && byteBits[byteIndex]) //Extra bits must be 0
                    {
                        return(false);
                    }

                    if (byteBits[byteIndex])
                    {
                        PieceIndexes.Add(pieceIndex);
                    }

                    pieceIndex++;
                }
            }

            return(true);
        }
예제 #2
0
        public long?RetrievePieceIndexIfAny(List <long> neededPieces)
        {
            if (!neededPieces.Any())
            {
                return(null);
            }

            if (!PieceIndexes.Any())
            {
                return(null);
            }

            var intersection = PieceIndexes.Intersect(neededPieces).ToList();

            if (!intersection.Any())
            {
                return(null);
            }

            return(intersection.First());
        }