Esempio n. 1
0
        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);
        }
Esempio n. 2
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();
            }
        }
Esempio n. 3
0
        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();
        }