Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        public void ChangePicker(PiecePicker picker)
        {
            Check.Picker(picker);

            ClientEngine.MainLoop.QueueWait(
                delegate { this.PieceManager.ChangePicker(picker, Bitfield, Torrent.Files); });
        }
Esempio n. 3
0
        public void TestPiecePicker6()
        {
            PiecePicker piecePicker1 = new PiecePicker(0);
            List <int>  pull1        = Pull(piecePicker1);

            Assert.AreEqual(0, pull1.Count);
        }
Esempio n. 4
0
 /// <summary>
 /// Start requesting pieces
 /// </summary>
 public void Start(bool stopAfterFinish = true)
 {
     AnnounceManager.Start();
     if (stopAfterFinish)
     {
         PiecePicker.Finished += Stop;
     }
     PiecePicker.Start();
 }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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;
        }
Esempio n. 7
0
 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);
     }
 }
Esempio n. 8
0
        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));
        }
Esempio n. 9
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]);
        }
Esempio n. 10
0
 /// <summary>
 /// Gracefully shutdown the client
 /// </summary>
 public void Stop()
 {
     AnnounceManager.Stop();
     PiecePicker.Stop();
     PieceStorage.Dispose();
 }
Esempio n. 11
0
        /// <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)
 {
 }
Esempio n. 13
0
 public void ChangePicker(PiecePicker piecePicker)
 {
     Torrent.ChangePicker(piecePicker);
     PiecePicker = piecePicker;
 }