예제 #1
0
        void peer_PieceMessageReceived(object sender, PieceMessage e)
        {
            //lock ((object)_recievePieceNumber)
            //{
            //    _recievePieceNumber++;
            //    Console.WriteLine("_recievePieceNumber:{0}, piece:{1}", _recievePieceNumber, e);
            //}
            ShowMessage("{0}:Received {1}", sender, e);
            _blockManager.Write(e.GetBlock(), e.Index, e.Begin);

            Peer peer = (Peer)sender;

            peer.RemoveRequestedBlock(e.Index, e.Begin);

            //if received piece is corrent, it will request the next piece,
            //otherwise it will request the crash piece again.
            if (_blockManager[e.Index].AllDownloaded)
            {
                if (_blockManager.CheckPiece(e.Index))
                {
                    lock (_peerList)
                    {
                        foreach (Peer p in _peerList)
                        {
                            if (p.IsHandshaked)
                            {
                                p.SendHaveMessageAsync(e.Index);
                            }
                        }
                    }
                }
                else
                {
                    failTimes++;
                    _blockManager.ResetDownloaded(e.Index);
                    _blockManager.ResetRequestedByIndex(e.Index);
                }
            }
            RequestNextBlocks(peer, 1);
        }