Beispiel #1
0
        protected PieceRequest GetFromList(IPieceRequester peer, BitField bitfield, IList <int> pieces)
        {
            if (!peer.SupportsFastPeer || !ClientEngine.SupportsFastPeer)
            {
                return(null);
            }

            for (int i = 0; i < pieces.Count; i++)
            {
                int index = pieces[i];
                // A peer should only suggest a piece he has, but just in case.
                if (index >= bitfield.Length || !bitfield[index] || AlreadyRequested(index))
                {
                    continue;
                }

                pieces.RemoveAt(i);
                var p = new Piece(index, TorrentData.PieceLength, TorrentData.Size);
                requests.Add(p);
                return(p.Blocks[0].CreateRequest(peer));
            }


            return(null);
        }
Beispiel #2
0
        public virtual IList <PieceRequest> GetStandardRequest(PeerId id, BitField current, List <PeerId> otherPeers, int startIndex, int endIndex, int count)
        {
            int piecesNeeded = (count * Piece.BlockSize) / id.TorrentManager.Torrent.PieceLength;

            if ((count * Piece.BlockSize) % id.TorrentManager.Torrent.PieceLength != 0)
            {
                piecesNeeded++;
            }
            int checkIndex = CanRequest(current, startIndex, endIndex, ref piecesNeeded);

            // Nothing to request.
            if (checkIndex == -1)
            {
                return(null);
            }

            var bundle = new List <PieceRequest>();

            for (int i = 0; bundle.Count < count && i < piecesNeeded; i++)
            {
                // Request the piece
                Piece p = new Piece(checkIndex + i, id.TorrentManager.Torrent.PieceLength, id.TorrentManager.Torrent.Size);
                requests.Add(p);
                for (int j = 0; j < p.Blocks.Length && bundle.Count < count; j++)
                {
                    bundle.Add(p.Blocks[j].CreateRequest(id));
                }
            }
            return(bundle);
        }
        public IList <PieceRequest> GetStandardRequest(IPieceRequester peer, BitField current, int startIndex, int endIndex, int count)
        {
            int piecesNeeded = (count * Piece.BlockSize) / TorrentData.PieceLength;

            if ((count * Piece.BlockSize) % TorrentData.PieceLength != 0)
            {
                piecesNeeded++;
            }
            int checkIndex = CanRequest(current, startIndex, endIndex, ref piecesNeeded);

            // Nothing to request.
            if (checkIndex == -1)
            {
                return(null);
            }

            var bundle = new List <PieceRequest>();

            for (int i = 0; bundle.Count < count && i < piecesNeeded; i++)
            {
                // Request the piece
                Piece p = new Piece(checkIndex + i, TorrentData.PieceLength, TorrentData.Size);
                requests.Add(p);
                for (int j = 0; j < p.Blocks.Length && bundle.Count < count; j++)
                {
                    bundle.Add(p.Blocks[j].CreateRequest(peer));
                }
            }
            return(bundle);
        }