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); } }
protected virtual void HandleHaveAllMessage(PeerId id, HaveAllMessage message) { id.BitField.SetAll(true); id.Peer.IsSeeder = true; SetAmInterestedStatus(id, manager.PieceManager.IsInteresting(id)); }
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 }