public override void Tick(int counter)
 {
     base.Tick(counter);
     if (unchoker.Complete)
     {
         PeerMessage bitfieldMessage = new BitfieldMessage(Manager.Bitfield);
         PeerMessage haveAllMessage = new HaveAllMessage();
         foreach (var peer in Manager.Peers.ConnectedPeers)
         {
             var message = peer.SupportsFastPeer && Manager.Complete ? haveAllMessage : bitfieldMessage;
             peer.Enqueue(message);
         }
         Manager.Mode = new DownloadMode(Manager);
     }
 }
Esempio n. 2
0
 protected virtual void HandleHaveAllMessage(PeerId id, HaveAllMessage message)
 {
     id.BitField.SetAll(true);
     id.Peer.IsSeeder = true;
     SetAmInterestedStatus(id, manager.PieceManager.IsInteresting(id));
 }
Esempio n. 3
0
        private void PeerHandshakeReceived(bool succeeded, int count, object state)
        {
            PeerId id = (PeerId)state;
            string reason = null;
            bool cleanUp = false;
            PeerMessage msg;

            try
            {
                // If the connection is closed, just return
                if (!succeeded)
                {
                    CleanupSocket(id, "Handshaking failed");
                    return;
                }
                // Decode the handshake and handle it
                id.Decryptor.Decrypt(id.recieveBuffer.Array, id.recieveBuffer.Offset, count);
                msg = new HandshakeMessage();
                msg.Decode(id.recieveBuffer, 0, count);
                msg.Handle(id);

                Logger.Log(id.Connection, "ConnectionManager - Handshake recieved");
                if (id.SupportsFastPeer && ClientEngine.SupportsFastPeer)
                {
                    if (id.TorrentManager.Bitfield.AllFalse || id.TorrentManager.IsInitialSeeding)
                        msg = new HaveNoneMessage();

                    else if (id.TorrentManager.Bitfield.AllTrue)
                        msg = new HaveAllMessage();

                    else
                        msg = new BitfieldMessage(id.TorrentManager.Bitfield);
                }
                else if (id.TorrentManager.IsInitialSeeding)
                {
                    BitField btfld = new BitField(id.TorrentManager.Bitfield.Length);
                    btfld.SetAll(false);
                    msg = new BitfieldMessage(btfld);
                }
                else
                {
                    msg = new BitfieldMessage(id.TorrentManager.Bitfield);
                }

                if (id.SupportsLTMessages && ClientEngine.SupportsExtended)
                {
                    MessageBundle bundle = new MessageBundle();
                    bundle.Messages.Add(new ExtendedHandshakeMessage());
                    bundle.Messages.Add(msg);
                    msg = bundle;
                }

                //ClientEngine.BufferManager.FreeBuffer(ref id.recieveBuffer);
                SendMessage(id, msg, this.bitfieldSentCallback);
            }
            catch (TorrentException)
            {
                Logger.Log(id.Connection, "ConnectionManager - Couldn't decode the message");
                reason = "Couldn't decode handshake";
                cleanUp = true;
                return;
            }
            finally
            {
                if (cleanUp)
                    CleanupSocket(id, reason);
            }
        }
 protected override void HandleHaveAllMessage(PeerId id,
     HaveAllMessage message)
 {
     // Nothing
 }