public void TestPiecePicker1() { PiecePicker piecePicker1 = new PiecePicker(8); //收到第0,2,4和6个片断的have信息 piecePicker1.GotHave(0); piecePicker1.GotHave(2); piecePicker1.GotHave(4); piecePicker1.GotHave(6); //发送第0,1,3,6个片断的请求信息 piecePicker1.Requested(1); piecePicker1.Requested(1); piecePicker1.Requested(3); piecePicker1.Requested(0); piecePicker1.Requested(6); List <int> pull1 = Pull(piecePicker1); //因为第5和7个片断没有发送request信息,并且没有收到have信息,所以请求队列长度为6 Assert.AreEqual(6, pull1.Count); //严格优先选择策略 Assert.AreEqual(1, pull1[0]); Assert.AreEqual(3, pull1[1]); Assert.AreEqual(0, pull1[2]); Assert.AreEqual(6, pull1[3]); Assert.AreEqual(true, (pull1[4] == 2 && pull1[5] == 4) || (pull1[4] == 4 && pull1[5] == 2)); }
public void ChangePicker(PiecePicker picker) { Check.Picker(picker); ClientEngine.MainLoop.QueueWait( delegate { this.PieceManager.ChangePicker(picker, Bitfield, Torrent.Files); }); }
public void TestPiecePicker6() { PiecePicker piecePicker1 = new PiecePicker(0); List <int> pull1 = Pull(piecePicker1); Assert.AreEqual(0, pull1.Count); }
/// <summary> /// Start requesting pieces /// </summary> public void Start(bool stopAfterFinish = true) { AnnounceManager.Start(); if (stopAfterFinish) { PiecePicker.Finished += Stop; } PiecePicker.Start(); }
public void DoesntHaveSuggestedPiece() { peer.IsChoking = false; peer.SupportsFastPeer = true; peer.SuggestedPieces.AddRange(new[] { 1, 2, 3, 4 }); peer.BitField.SetAll(true); picker = new StandardPicker(); picker.Initialise(rig.Manager.Bitfield, rig.Torrent.Files, new List <Piece>()); var bundle = picker.PickPiece(peer, new OctoTorrent.Common.BitField(peer.BitField.Length), peers, 1, 0, peer.BitField.Length); Assert.IsNull(bundle); }
internal void ChangePicker(PiecePicker picker, BitField bitfield, TorrentFile[] files) { if (UnhashedPieces.Length != bitfield.Length) { UnhashedPieces = new BitField(bitfield.Length); } picker = new IgnoringPicker(bitfield, picker); picker = new IgnoringPicker(UnhashedPieces, picker); IEnumerable <Piece> pieces = Picker == null ? new List <Piece>() : Picker.ExportActiveRequests(); picker.Initialise(bitfield, files, pieces); Picker = picker; }
public virtual void Setup() { // Yes, this is horrible. Deal with it. rig = TestRig.CreateMultiFile(); peers = new List <PeerId>(); picker = new IgnoringPicker(rig.Manager.Bitfield, new StandardPicker()); picker.Initialise(rig.Manager.Bitfield, rig.Manager.Torrent.Files, new List <Piece>()); peer = new PeerId(new Peer(new string('a', 20), new Uri("tcp://BLAH")), rig.Manager); for (int i = 0; i < 20; i++) { PeerId p = new PeerId(new Peer(new string(i.ToString()[0], 20), new Uri("tcp://" + i)), rig.Manager); p.SupportsFastPeer = true; peers.Add(p); } }
public void TestPiecePicker2() { PiecePicker piecePicker1 = new PiecePicker(8); //收到第0,2,4和6个片断的have信息 piecePicker1.GotHave(0); piecePicker1.GotHave(2); piecePicker1.GotHave(4); piecePicker1.GotHave(6); //丢失第2和6个片断的have信息 piecePicker1.LostHave(2); piecePicker1.LostHave(6); List <int> pull1 = Pull(piecePicker1); Assert.AreEqual(2, pull1.Count); Assert.AreEqual(true, (pull1[0] == 0 && pull1[1] == 4) || (pull1[0] == 4 && pull1[1] == 0)); }
public void TestPiecePicker4() { PiecePicker piecePicker1 = new PiecePicker(3); //完成了第2个片断 piecePicker1.Complete(2); //发送第1个片断的请求信息 piecePicker1.Requested(0); //收到第0和1个片断的have信息 piecePicker1.GotHave(1); piecePicker1.GotHave(0); piecePicker1.GotHave(0); List <int> pull1 = Pull(piecePicker1); Assert.AreEqual(2, pull1.Count); Assert.AreEqual(1, pull1[0]); Assert.AreEqual(0, pull1[1]); }
/// <summary> /// Gracefully shutdown the client /// </summary> public void Stop() { AnnounceManager.Stop(); PiecePicker.Stop(); PieceStorage.Dispose(); }
/// <summary> /// Creates new BtClient /// </summary> /// <param name="meta">Torrent metainfo</param> /// <param name="clientEndPoint">Client's external network endpoint. Must be accessible by other peers</param> /// <param name="defaultEncoding">Message text encoding</param> /// <param name="output">Output stream. If torrent contains multiple files </param> /// <param name="blockLen">Piece block length in bytes. 10^14 bytes if not specified</param> /// <param name="fileName">File name to download. If not specified all files will be downloaded</param> /// <param name="dhtEndPoint">Mainline DHT's client endpoint. DHT will not be used if parameter is null</param> /// <param name="storage">Storage for caching pieces. If not specified MemCachedPieceStorage will be used</param> /// <param name="cancelToken">Requesting cancel on this CancellationToken causes forcefull shutdown of client</param> public BtClient(Metainfo meta, IPEndPoint clientEndPoint, Encoding defaultEncoding, Stream output, int blockLen = 16384, string fileName = null, PiecePickStrategy piecePickStrategy = PiecePickStrategy.RarestFirst, IPEndPoint dhtEndPoint = null, IPieceStorage storage = null, CancellationToken?cancelToken = null) { Metainfo = meta; _endPoint = clientEndPoint; DefaultEncoding = defaultEncoding; _peerId = GeneratePeerId(); Handshake = CalcHandshake(); BlockLength = blockLen; BlocksInPieceCount = Metainfo.PieceLength / BlockLength; AnnounceManager = new AnnounceManager(this, Metainfo.Announces); IResourcePool <Peers.Peer> peersPool = AnnounceManager; if (dhtEndPoint != null) { MainlineManager = new MainlineManagerExt(clientEndPoint, dhtEndPoint, meta.InfoHash); peersPool = new MergedPool <Peer>(new IResourcePool <Peer>[] { AnnounceManager, MainlineManager }); } if (storage == null) { storage = new FileStorage(Metainfo, BlockLength); } PieceStorage = storage; BitField piecesHave = PieceStorage.GetValidPieces(); IRequestStrategy rqStrat = null; switch (piecePickStrategy) { case PiecePickStrategy.RarestFirst: RarestFirstRqStrategy rarestFirstRqStrategy = new RarestFirstRqStrategy(Metainfo.PiecesCount, piecesHave); rqStrat = rarestFirstRqStrategy; PeerStateCache = new PeerStateCache(rarestFirstRqStrategy); break; case PiecePickStrategy.Random: rqStrat = new RandomPieceRqStrategy(Metainfo.PiecesCount, piecesHave); break; case PiecePickStrategy.Sequential: rqStrat = new SequentialPieceRqStrategy(Metainfo.PiecesCount); break; case PiecePickStrategy.SequentialOneFile: if (string.IsNullOrEmpty(fileName)) { throw new ArgumentException("fileName"); } rqStrat = new SequentialPieceRqStrategyOneFile(Metainfo, fileName); break; default: break; } if (PeerStateCache == null) { PeerStateCache = new PeerStateCache(); } ConnectionManager = new ConnectionHub(this, clientEndPoint, peersPool, PeerStateCache); HandlerExchange = new HandlerExchange(ConnectionManager, PeerStateCache); PiecePicker = new PiecePicker(this, HandlerExchange, rqStrat, BlockLength, cancelToken); }
public CustomPiecePicker(PiecePicker picker) : base(picker) { }
public void ChangePicker(PiecePicker piecePicker) { Torrent.ChangePicker(piecePicker); PiecePicker = piecePicker; }