private int HandleDisconnect(Peer peer, Protocol.Disconnect command) { if (peer.State == PeerState.ZOMBIE || peer.State == PeerState.ACKNOWLEDGING_DISCONNECT) { return(0); } peer.ResetQueues(); if (peer.State == PeerState.CONNECTION_SUCCEEDED || peer.State == PeerState.DISCONNECTING) { DispatchState(peer, PeerState.ZOMBIE); } else if (peer.State != PeerState.CONNECTED && peer.State != PeerState.DISCONNECT_LATER) { if (peer.State == PeerState.CONNECTION_PENDING) { RecalculateBandwidthLimits = true; } peer.Reset(); } else if (command.Flags.HasFlag(ProtocolFlag.ACKNOWLEDGE)) { peer.State = PeerState.ACKNOWLEDGING_DISCONNECT; } else { DispatchState(peer, PeerState.ZOMBIE); } peer.DisconnectData = command.Data; return(0); }
public void Disconnect(uint data) { if (State == PeerState.DISCONNECTING || State == PeerState.DISCONNECTED || State == PeerState.ACKNOWLEDGING_DISCONNECT || State == PeerState.ZOMBIE) { return; } ResetQueues(); var command = new Protocol.Disconnect { ChannelID = 0xFF, Data = data, }; if (State == PeerState.CONNECTED || State == PeerState.DISCONNECT_LATER) { command.Flags |= ProtocolFlag.ACKNOWLEDGE; } else { command.Flags |= ProtocolFlag.UNSEQUENCED; } QueueOutgoingCommand(command, null, 0, 0); if (State == PeerState.CONNECTED || State == PeerState.DISCONNECT_LATER) { State = PeerState.DISCONNECTING; } else { Host.Flush(); Reset(); } }
public void DisconnectNow(uint data) { if (State == PeerState.DISCONNECTED) { return; } if (State != PeerState.ZOMBIE && State != PeerState.DISCONNECTING) { ResetQueues(); var command = new Protocol.Disconnect { Flags = ProtocolFlag.UNSEQUENCED, ChannelID = 0xFF, Data = data, }; QueueOutgoingCommand(command, null, 0, 0); Host.Flush(); } Reset(); }