Ejemplo n.º 1
0
        internal void AddPieceRequests(PeerId id)
        {
            int maxRequests = id.MaxPendingRequests;

            if (id.AmRequestingPiecesCount >= maxRequests)
            {
                return;
            }

            int count = 1;

            if (id.Connection is HttpConnection)
            {
                if (id.AmRequestingPiecesCount > 0)
                {
                    return;
                }

                // How many whole pieces fit into 2MB
                count = (2 * 1024 * 1024) / Manager.Torrent.PieceLength;

                // Make sure we have at least one whole piece
                count = Math.Max(count, 1);

                count *= Manager.Torrent.PieceLength / Piece.BlockSize;
            }

            if (!id.IsChoking || id.SupportsFastPeer)
            {
                while (id.AmRequestingPiecesCount < maxRequests)
                {
                    PieceRequest request = Picker.ContinueExistingRequest(id, 0, id.BitField.Length - 1);
                    if (request != null)
                    {
                        id.MessageQueue.Enqueue(new RequestMessage(request.PieceIndex, request.StartOffset, request.RequestLength));
                    }
                    else
                    {
                        break;
                    }
                }
            }

            if (!id.IsChoking || (id.SupportsFastPeer && id.IsAllowedFastPieces.Count > 0))
            {
                while (id.AmRequestingPiecesCount < maxRequests)
                {
                    List <PeerId>        otherPeers = Manager.Peers.ConnectedPeers ?? new List <PeerId> ();
                    IList <PieceRequest> request    = Picker.PickPiece(id, id.BitField, otherPeers, count);
                    if (request != null && request.Count > 0)
                    {
                        id.MessageQueue.Enqueue(new RequestBundle(request));
                    }
                    else
                    {
                        break;
                    }
                }
            }

            if (!id.IsChoking && id.AmRequestingPiecesCount == 0)
            {
                while (id.AmRequestingPiecesCount < maxRequests)
                {
                    PieceRequest request = Picker.ContinueAnyExisting(id, 0, Manager.Bitfield.Length - 1);
                    if (request != null)
                    {
                        id.MessageQueue.Enqueue(new RequestMessage(request.PieceIndex, request.StartOffset, request.RequestLength));
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }