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; } } } }