コード例 #1
0
        /// <summary>
        /// 初期化
        /// </summary>
        private void Initialization()
        {
            // デフォルト設定
            this.m_LocalEncoding  = Encoding.GetEncoding("UTF-8");
            this.m_RemoteEncoding = Encoding.GetEncoding("UTF-8");
            this.m_ReadNewLine    = "\n";
            this.m_WriteNewLine   = "\n";

            // Telnetオプション状態初期化
            for (TelnetOption opt = TelnetOption.binary; opt < TelnetOption.max; opt++)
            {
                this.m_Local[opt]  = new NegotiationStatus();
                this.m_Remote[opt] = new NegotiationStatus();
            }

            // 各Telnetオプション初期設定
            this.m_Local[TelnetOption.binary].Accept             = true;
            this.m_Remote[TelnetOption.binary].Accept            = true;
            this.m_Local[TelnetOption.suppress_go_ahead].Accept  = true;
            this.m_Remote[TelnetOption.suppress_go_ahead].Accept = true;
            this.m_Remote[TelnetOption.echo].Accept          = true;
            this.m_Local[TelnetOption.terminal_type].Accept  = true;
            this.m_Local[TelnetOption.terminal_speed].Accept = true;
            this.m_Local[TelnetOption.window_size].Accept    = true;
            this.m_Remote[TelnetOption.window_size].Accept   = true;

            // イベントハンドラ設定
            this.OnConnected    += this.ConnectedEvent;
            this.OnSend         += this.SendEvent;
            this.OnRecive       += this.ReciveEvent;
            this.OnDisconnected += this.DisonnectedEvent;
        }
コード例 #2
0
        /// <summary>
        /// 初期化
        /// </summary>
        private void Initialization()
        {
            // デフォルト設定
            this.m_LocalEncoding  = Encoding.GetEncoding("UTF-8");
            this.m_RemoteEncoding = Encoding.GetEncoding("UTF-8");
            this.m_ReadNewLine    = "\n";
            this.m_WriteNewLine   = "\n";

            // Telnetオプション状態初期化
            for (TelnetOption opt = TelnetOption.binary; opt < TelnetOption.max; opt++)
            {
                this.m_Local[opt]  = new TelnetNegotiationStatus();
                this.m_Remote[opt] = new TelnetNegotiationStatus();
            }

            // 各Telnetオプション初期設定
            this.m_Local[TelnetOption.binary].Accept             = true;
            this.m_Remote[TelnetOption.binary].Accept            = true;
            this.m_Local[TelnetOption.suppress_go_ahead].Accept  = true;
            this.m_Remote[TelnetOption.suppress_go_ahead].Accept = true;
            this.m_Remote[TelnetOption.echo].Accept          = true;
            this.m_Local[TelnetOption.terminal_type].Accept  = true;
            this.m_Local[TelnetOption.terminal_speed].Accept = true;
            this.m_Local[TelnetOption.window_size].Accept    = true;
            this.m_Remote[TelnetOption.window_size].Accept   = true;
        }
コード例 #3
0
        void EndSequence(TelnetOption option)
        {
            try
            {
                if (option == TelnetOption.TerminalType)
                {
                    if (!Properties.ContainsKey("TerminalType"))
                        Properties["TerminalType"] = string.Empty;
                    var name = Properties["TerminalType"] as string ?? string.Empty;
                    if (name.Length > 0)
                        name += " ";

                    name += Encoding.ASCII.GetString(_sequence.ToArray());
                    Properties["TerminalType"] = name;
                }

                if (option == TelnetOption.WindowSize)
                {
                    Properties["Width"] = (short)_sequence[0];
                    Properties["Height"] = (short)_sequence[1];
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.ToString());
            }

            _sequence.Clear();
            _telnetCommand = null;
        }
コード例 #4
0
 /// <summary>
 /// コピーコンストラクタ
 /// </summary>
 /// <param name="info"></param>
 public NegotiationInfomation(NegotiationInfomation info)
 {
     this.IAC     = info.IAC;
     this.Command = info.Command;
     this.Option  = info.Option;
     this.Stream  = info.Stream;
 }
コード例 #5
0
        public TelnetCommandBuilder Add(TelnetVerb verb, TelnetOption option)
        {
            _data.Add((byte)TelnetVerb.IAC);
            _data.Add((byte)verb);
            _data.Add((byte)option);

            return(this);
        }
コード例 #6
0
 /// <summary>
 /// Process a remote query if a specified option is currently enabled
 /// </summary>
 /// <param name="Option">Option to query</param>
 /// <returns>TRUE if option is currently enabled, FALSE if option is currently disabled or not known/understood</returns>
 virtual public bool Get(TelnetOption Option)
 {
     switch (Option)
     {
     case TelnetOption.ECHO:
         return(DoEcho);
     }
     return(false);
 }
コード例 #7
0
        /// <summary>
        /// 応答送信
        /// </summary>
        /// <param name="command"></param>
        /// <param name="option"></param>
        private MemoryStream SendBack(TelnetCommand command, TelnetOption option)
        {
            // 送信メモリオブジェクト生成
            MemoryStream sendStream = new MemoryStream();

            sendStream.WriteByte((byte)TelnetCommand.IAC);
            sendStream.WriteByte((byte)command);
            sendStream.WriteByte((byte)option);
            return(sendStream);
        }
コード例 #8
0
        public async Task Handle(TelnetCommand command, TelnetOption option, ITelnetChannel channel)
        {
            TelnetCommand response = command.Reciprocal().AsNegative();

            //if (option == TelnetOption.SuppressGoAhead && command.IsPositive())
            //{
            //    response = response.AsPositive();
            //}

            await channel.SendCommandAsync(response, option);
        }
コード例 #9
0
        private void ProcessOptionRequest(byte option_)
        {
            TelnetOption option = (TelnetOption)option_;

            switch (option)
            {
            case TelnetOption.TerminalType:
                if (_state == TelnetCode.DO)
                {
                    _optionWriter.Write(TelnetCode.WILL, option);
                }
                else
                {
                    _warnings.Add(PEnv.Strings.GetString("Message.Telnet.FailedToSendTerminalType"));
                }
                break;

            case TelnetOption.NAWS:
                if (_state == TelnetCode.DO)
                {
                    _optionWriter.WriteTerminalSize(_width, _height);
                }
                else
                {
                    _warnings.Add(PEnv.Strings.GetString("Message.Telnet.FailedToSendWidnowSize"));
                }
                break;

            case TelnetOption.SuppressGoAhead:
                if (_state != TelnetCode.WILL && _state != TelnetCode.DO)     //!!両方が来たことを確認する
                {
                    _warnings.Add(PEnv.Strings.GetString("Message.Telnet.FailedToSendSuppressGoAhead"));
                }
                break;

            case TelnetOption.LocalEcho:
                if (_state == TelnetCode.DO)
                {
                    _optionWriter.Write(TelnetCode.WILL, option);
                }
                break;

            default:     //上記以外はすべて拒否。DOにはWON'T, WILLにはDON'Tの応答を返す。
                if (_state == TelnetCode.DO)
                {
                    _optionWriter.Write(TelnetCode.WONT, option);
                }
                else if (_state == TelnetCode.WILL)
                {
                    _optionWriter.Write(TelnetCode.DONT, option);
                }
                break;
            }
        }
コード例 #10
0
        private void ProcessOptionRequest(byte option_)
        {
            TelnetOption option = (TelnetOption)option_;

            switch (option)
            {
            case TelnetOption.TerminalType:
                if (_state == TelnetCode.DO)
                {
                    _optionWriter.Write(TelnetCode.WILL, option);
                }
                else
                {
                    _warnings.Add("Message.Telnet.FailedToSendTerminalType");
                }
                break;

            case TelnetOption.NAWS:
                if (_state == TelnetCode.DO)
                {
                    _optionWriter.WriteTerminalSize(_width, _height);
                }
                else
                {
                    _warnings.Add("Message.Telnet.FailedToSendWidnowSize");
                }
                break;

            case TelnetOption.SuppressGoAhead:
                if (_state != TelnetCode.WILL && _state != TelnetCode.DO)                    //!!—¼•û‚ª—ˆ‚½‚±‚Æ‚ðŠm”F‚·‚é
                {
                    _warnings.Add("Message.Telnet.FailedToSendSuppressGoAhead");
                }
                break;

            case TelnetOption.LocalEcho:
                if (_state == TelnetCode.DO)
                {
                    _optionWriter.Write(TelnetCode.WILL, option);
                }
                break;

            default:                     //ã‹LˆÈŠO‚Í‚·‚ׂċ‘”ہBDO‚É‚ÍWON'T, WILL‚É‚ÍDON'T‚̉ž“š‚ð•Ô‚·B
                if (_state == TelnetCode.DO)
                {
                    _optionWriter.Write(TelnetCode.WONT, option);
                }
                else if (_state == TelnetCode.WILL)
                {
                    _optionWriter.Write(TelnetCode.DONT, option);
                }
                break;
            }
        }
コード例 #11
0
        public TelnetCommandBuilder AddSequence(TelnetOption option, params byte[] args)
        {
            Add(TelnetVerb.SB, option);
            if (args != null && args.Length > 0)
            {
                _data.AddRange(args);
            }
            _data.Add((byte)TelnetVerb.IAC);
            _data.Add((byte)TelnetVerb.SE);

            return(this);
        }
コード例 #12
0
        /// <summary>
        /// Process a remote connection attempt to enable or disabled the specified option.
        /// If the option is known, it should be immediately set to the specified state (if Enabled is true, option subnegotiation may proceed later)
        /// </summary>
        /// <param name="Option">Option to enable</param>
        /// <param name="Enabled">Requested state of the option</param>
        /// <returns>TRUE if option is enabled, FALSE if option is not enabled or is not known/understood</returns>
        virtual public bool Set(TelnetOption Option, bool Enabled)
        {
            switch (Option)
            {
            case TelnetOption.ECHO:
                DoEcho = Enabled;
                return(true);

            default:
                return(false);
            }
        }
コード例 #13
0
        /// <summary>
        /// 応答送信
        /// </summary>
        /// <param name="command"></param>
        /// <param name="option"></param>
        private void SendBack(TelnetCommand command, TelnetOption option)
        {
            // 送信メモリオブジェクト生成
            MemoryStream sendStream = new MemoryStream();

            sendStream.WriteByte((byte)TelnetCommand.IAC);
            sendStream.WriteByte((byte)command);
            sendStream.WriteByte((byte)option);

            // 送信
            this.Parse(sendStream.ToArray());
            this.Send(sendStream);
        }
コード例 #14
0
ファイル: TelnetTerminal.cs プロジェクト: dzakic/Sezam
        // Array of states. Count sent requests, give up after MAX(3?)
        //    { [Option, desiredState] }
        // if command in [do, dont]
        //    if (requested == desired) send cfm, else request(desired)
        // if command in (will, wont)
        //    if (confirmation != desired) send request(desired) else silent

        private void ProcessTelnetCommands()
        {
            int next = PeekByteFromNetworkStream();

            Debug.Assert(next == (byte)Command.IAC, "We should not be here if telnet command not pending");
            while (next == (byte)Command.IAC)
            {
                Command iac = (Command)GetByteFromNetworkStream();
                Command cmd = (Command)GetByteFromNetworkStream();
                Option  opt = Option.NONE;
                switch (cmd)
                {
                case Command.DO:
                case Command.DONT:
                case Command.WILL:
                case Command.WONT:
                    opt = (Option)GetByteFromNetworkStream();
                    Debug.Write("[CLIENT: " + cmd.ToString() + " " + opt.ToString() + "] ");
                    TelnetOption telOpt = telnetOptions.Where(topt => topt.opt == opt).FirstOrDefault();
                    if (telOpt != null)
                    {
                        if (cmd == Command.DO || cmd == Command.DONT)
                        {
                            telOpt.myState = cmd == Command.DO;
                            if (telOpt.MyCommandConflictsDesired(cmd))
                            {
                                SendCode(telOpt.MyDesiredCommand, opt);
                            }
                        }
                        if (cmd == Command.WILL || cmd == Command.WONT)
                        {
                            telOpt.clientState = cmd == Command.WILL;
                            if (telOpt.ClientCommandConflictsDesired(cmd))
                            {
                                SendCode(telOpt.ClientDesiredCommand, opt);
                            }
                        }
                    }
                    break;

                case Command.SB:
                    ProcessSubnegotiation();
                    break;

                default:
                    break;
                }
                next = PeekByteFromNetworkStream();
            }
        }
コード例 #15
0
    /// <summary>
    /// Handles a Telnet command.
    /// </summary>
    /// <param name="e">Information about the data received.</param>
    private void HandleCommand(SocketAsyncEventArgs e)
    {
        Connection c = e.UserToken as Connection;

        if (c == null || e.BytesTransferred < 3)
        {
            return;
        }
        for (int i = 0; i < e.BytesTransferred; i += 3)
        {
            if (e.BytesTransferred - i < 3)
            {
                break;
            }
            if (e.Buffer[i] == (int)TelnetCommand.IAC)
            {
                TelnetCommand command = (TelnetCommand)e.Buffer[i + 1];
                TelnetOption  option  = (TelnetOption)e.Buffer[i + 2];
                switch (command)
                {
                case TelnetCommand.DO:
                    if (option == TelnetOption.Echo)
                    {
                        // ECHO
                    }
                    break;

                case TelnetCommand.WILL:
                    if (option == TelnetOption.Echo)
                    {
                        // ECHO
                    }
                    break;
                }
                c.ReceiveBuffer.Remove(i, 3);
            }
        }
    }
コード例 #16
0
        internal override void OnIncomingMessage(INetworkNode From, byte[] NewMessage)
        {
            List <byte> Message = new List <byte>(NewMessage.Length);

            for (int i = 0; i < NewMessage.Length; i++)
            {
                switch (RemoteState[From])
                {
                case NVTState.AcceptingCommand:
                    switch (NewMessage[i])
                    {
                    case (byte)TelnetCommand.DO:
                        RemoteState[From] = NVTState.DoOption; break;

                    case (byte)TelnetCommand.DONT:
                        RemoteState[From] = NVTState.DontOption; break;

                    case (byte)TelnetCommand.WILL:
                        RemoteState[From] = NVTState.WillOption; break;

                    case (byte)TelnetCommand.WONT:
                        RemoteState[From] = NVTState.WontOption; break;

                    case (byte)TelnetCommand.IAC:
                        Message.Add(NewMessage[i]);
                        break;
                    }
                    break;

                // Process Telnet "DO, DON'T, WILL, WON'T" option negotiation
                case NVTState.DoOption:
                    TelnetOption Option = (TelnetOption)NewMessage[i];
                    if (!Get(Option))
                    {
                        Send(From, new byte[] { (byte)TelnetCommand.IAC, (byte)(Set(Option, true) ? TelnetCommand.WILL : TelnetCommand.WONT), (byte)Option });
                    }
                    RemoteState[From] = NVTState.Normal;
                    break;

                case NVTState.DontOption:
                    Option = (TelnetOption)NewMessage[i];
                    if (Get(Option))
                    {
                        Send(From, new byte[] { (byte)TelnetCommand.IAC, (byte)(Set(Option, false) ? TelnetCommand.WONT : TelnetCommand.WILL), (byte)Option });
                    }
                    RemoteState[From] = NVTState.Normal;
                    break;

                case NVTState.WillOption:
                    Option = (TelnetOption)NewMessage[i];
                    Send(From, "[TCP WILL " + Option.ToString() + "]");
                    if (!Get(Option))
                    {
                        Send(From, new byte[] { (byte)TelnetCommand.IAC, (byte)(Set(Option, true) ? TelnetCommand.DO : TelnetCommand.DONT), (byte)Option });
                    }
                    RemoteState[From] = NVTState.Normal;
                    break;

                case NVTState.WontOption:
                    Option = (TelnetOption)NewMessage[i];
                    if (Get(Option))
                    {
                        Send(From, new byte[] { (byte)TelnetCommand.IAC, (byte)(Set(Option, false) ? TelnetCommand.DO : TelnetCommand.DONT), (byte)Option });
                    }
                    RemoteState[From] = NVTState.Normal;
                    break;

                default:
                    if (NewMessage[i] == (byte)TelnetCommand.IAC)
                    {
                        RemoteState[From] = NVTState.AcceptingCommand;
                    }
                    else
                    {
                        Message.Add(NewMessage[i]);
                    }
                    break;
                }
            }

            if (Message.Count() > 0)
            {
                base.OnIncomingMessage(From, Message.ToArray());
            }

            if (DoEcho)
            {
                _ = this.SendAsync(Message.ToArray());
            }
        }
コード例 #17
0
ファイル: TelnetConnection.cs プロジェクト: bravesoftdz/RMLib
        protected override void NegotiateInbound(byte[] data, int numberOfBytes)
        {
            for (int i = 0; i < numberOfBytes; i++)
            {
                if (_TelnetNegotiationState == TelnetNegotiationState.Data)
                {
                    if (data[i] == (byte)TelnetCommand.IAC)
                    {
                        _TelnetNegotiationState = TelnetNegotiationState.IAC;
                    }
                    else
                    {
                        AddToInputQueue(data[i]);
                    }
                }
                else if (_TelnetNegotiationState == TelnetNegotiationState.IAC)
                {
                    if (data[i] == (byte)TelnetCommand.IAC)
                    {
                        _TelnetNegotiationState = TelnetNegotiationState.Data;
                        AddToInputQueue(data[i]);
                    }
                    else
                    {
                        switch ((TelnetCommand)data[i])
                        {
                        case TelnetCommand.NoOperation:
                        case TelnetCommand.DataMark:
                        case TelnetCommand.Break:
                        case TelnetCommand.InterruptProcess:
                        case TelnetCommand.AbortOutput:
                        case TelnetCommand.AreYouThere:
                        case TelnetCommand.EraseCharacter:
                        case TelnetCommand.EraseLine:
                        case TelnetCommand.GoAhead:
                            // TODO We recognize, but ignore these for now
                            _TelnetNegotiationState = TelnetNegotiationState.Data;
                            break;

                        case TelnetCommand.Do: _TelnetNegotiationState = TelnetNegotiationState.Do; break;

                        case TelnetCommand.Dont: _TelnetNegotiationState = TelnetNegotiationState.Dont; break;

                        case TelnetCommand.Will: _TelnetNegotiationState = TelnetNegotiationState.Will; break;

                        case TelnetCommand.Wont: _TelnetNegotiationState = TelnetNegotiationState.Wont; break;

                        case TelnetCommand.Subnegotiation:
                            _TelnetNegotiationState    = TelnetNegotiationState.Subnegotiation;
                            _SubnegotiationData.Length = 0;
                            break;

                        default: _TelnetNegotiationState = TelnetNegotiationState.Data; break;
                        }
                    }
                }
                else if (_TelnetNegotiationState == TelnetNegotiationState.Do)
                {
                    switch ((TelnetOption)data[i])
                    {
                    case TelnetOption.TransmitBinary: SendWill(data[i]); break;

                    case TelnetOption.Echo: SendWill(data[i]); break;

                    case TelnetOption.SuppressGoAhead: SendWill(data[i]); break;

                    case TelnetOption.WindowSize: SendWont(data[i]); break;

                    case TelnetOption.TerminalType: SendWont(data[i]); break;

                    case TelnetOption.LineMode: SendWont(data[i]); break;

                    default: SendWont(data[i]); break;
                    }
                    _TelnetNegotiationState = TelnetNegotiationState.Data;
                }
                else if (_TelnetNegotiationState == TelnetNegotiationState.Dont)
                {
                    switch ((TelnetOption)data[i])
                    {
                    case TelnetOption.TransmitBinary: SendWill(data[i]); break;

                    case TelnetOption.Echo: SendWill(data[i]); break;

                    case TelnetOption.SuppressGoAhead: SendWill(data[i]); break;

                    case TelnetOption.WindowSize: SendWont(data[i]); break;

                    case TelnetOption.TerminalType: SendWont(data[i]); break;

                    case TelnetOption.LineMode: SendWont(data[i]); break;

                    default: SendWont(data[i]); break;
                    }
                    _TelnetNegotiationState = TelnetNegotiationState.Data;
                }
                else if (_TelnetNegotiationState == TelnetNegotiationState.Will)
                {
                    switch ((TelnetOption)data[i])
                    {
                    case TelnetOption.TransmitBinary: SendDo(data[i]); break;

                    case TelnetOption.Echo: SendDont(data[i]); break;

                    case TelnetOption.SuppressGoAhead: SendDo(data[i]); break;

                    case TelnetOption.WindowSize: SendDont(data[i]); break;

                    case TelnetOption.TerminalType: SendSubnegotiate(data[i]); break;

                    case TelnetOption.LineMode: SendDont(data[i]); break;

                    default: SendDont(data[i]); break;
                    }
                    _TelnetNegotiationState = TelnetNegotiationState.Data;
                }
                else if (_TelnetNegotiationState == TelnetNegotiationState.Wont)
                {
                    switch ((TelnetOption)data[i])
                    {
                    case TelnetOption.TransmitBinary: SendDont(data[i]); break;

                    case TelnetOption.Echo: SendDont(data[i]); break;

                    case TelnetOption.SuppressGoAhead: SendDo(data[i]); break;

                    case TelnetOption.WindowSize: SendDont(data[i]); break;

                    case TelnetOption.TerminalType: SendDont(data[i]); break;

                    case TelnetOption.LineMode: SendDont(data[i]); break;

                    default: SendDont(data[i]); break;
                    }
                    _TelnetNegotiationState = TelnetNegotiationState.Data;
                }
                // TODO Port to fTelnet, HtmlTerm
                else if (_TelnetNegotiationState == TelnetNegotiationState.Subnegotiation)
                {
                    // First byte of subnegotiation should be the option to negotiate
                    switch ((TelnetOption)data[i])
                    {
                    case TelnetOption.TerminalType:
                    case TelnetOption.WindowSize:
                        // Known option
                        _SubnegotiationOption = (TelnetOption)data[i];
                        break;

                    default:
                        // Unknown option
                        _SubnegotiationOption = TelnetOption.None;
                        break;
                    }
                    _TelnetNegotiationState = TelnetNegotiationState.SubnegotiationData;
                }
                else if (_TelnetNegotiationState == TelnetNegotiationState.SubnegotiationData)
                {
                    // Add next byte to negotiation string, unless it's an IAC
                    switch ((TelnetCommand)data[i])
                    {
                    case TelnetCommand.IAC: _TelnetNegotiationState = TelnetNegotiationState.SubnegotiationIAC; break;

                    default: _SubnegotiationData.Append((char)data[i]); break;
                    }
                }
                else if (_TelnetNegotiationState == TelnetNegotiationState.SubnegotiationIAC)
                {
                    // Check to see if negotiation has ended, or if it's just a doubled IAC
                    switch ((TelnetCommand)data[i])
                    {
                    case TelnetCommand.IAC:
                        // Doubled IAC means go back to data
                        _SubnegotiationData.Append((char)data[i]);
                        _TelnetNegotiationState = TelnetNegotiationState.SubnegotiationData;
                        break;

                    case TelnetCommand.EndSubnegotiation:
                        // Subnegotiation has ended
                        // TODO Do something with FSubnegotiationData based on FSubnegotiationOption
                        switch (_SubnegotiationOption)
                        {
                        case TelnetOption.TerminalType:
                            // TODO
                            break;

                        case TelnetOption.WindowSize:
                            // TODO
                            break;
                        }
                        _TelnetNegotiationState = TelnetNegotiationState.Data;
                        break;

                    default:
                        // Something unknown has happened
                        _TelnetNegotiationState = TelnetNegotiationState.Data;
                        break;
                    }
                }
                else
                {
                    _TelnetNegotiationState = TelnetNegotiationState.Data;
                }
            }
        }
コード例 #18
0
ファイル: TelnetConnection.cs プロジェクト: HolodeckOne/RMLib
 private void SendIAC(TelnetCommand command, TelnetOption option)
 {
     SendIAC(command, (byte)option);
 }
コード例 #19
0
ファイル: TelnetConnection.cs プロジェクト: HolodeckOne/RMLib
 public void SendWont(TelnetOption option)
 {
     SendIAC(TelnetCommand.Wont, option);
 }
コード例 #20
0
ファイル: TelnetConnection.cs プロジェクト: HolodeckOne/RMLib
 public void SendSubnegotiate(TelnetOption option)
 {
     SendSubnegotiate((byte)option);
 }
コード例 #21
0
 public void Write(TelnetCode code, TelnetOption opt)
 {
     _strm.WriteByte((byte)TelnetCode.IAC);
     _strm.WriteByte((byte)code);
     _strm.WriteByte((byte)opt);
 }
コード例 #22
0
ファイル: TelnetConnection.cs プロジェクト: HolodeckOne/RMLib
 public void SendDo(TelnetOption option)
 {
     SendIAC(TelnetCommand.Do, option);
 }
コード例 #23
0
ファイル: TelnetConnection.cs プロジェクト: bravesoftdz/RMLib
 public void SendDo(TelnetOption option)
 {
     SendIAC(TelnetCommand.Do, option);
 }
コード例 #24
0
ファイル: TelnetConnection.cs プロジェクト: HolodeckOne/RMLib
 public void SendWill(TelnetOption option)
 {
     SendIAC(TelnetCommand.Will, option);
 }
コード例 #25
0
ファイル: TelnetConnection.cs プロジェクト: bravesoftdz/RMLib
 private void SendIAC(TelnetCommand command, TelnetOption option)
 {
     SendIAC(command, (byte)option);
 }
コード例 #26
0
ファイル: TelnetConnection.cs プロジェクト: HolodeckOne/RMLib
 protected override void NegotiateInbound(byte[] data, int numberOfBytes)
 {
     for (int i = 0; i < numberOfBytes; i++)
     {
         if (_TelnetNegotiationState == TelnetNegotiationState.Data)
         {
             if (data[i] == (byte)TelnetCommand.IAC)
             {
                 _TelnetNegotiationState = TelnetNegotiationState.IAC;
             }
             else
             {
                 AddToInputQueue(data[i]);
             }
         }
         else if (_TelnetNegotiationState == TelnetNegotiationState.IAC)
         {
             if (data[i] == (byte)TelnetCommand.IAC)
             {
                 _TelnetNegotiationState = TelnetNegotiationState.Data;
                 AddToInputQueue(data[i]);
             }
             else
             {
                 switch ((TelnetCommand)data[i])
                 {
                     case TelnetCommand.NoOperation:
                     case TelnetCommand.DataMark:
                     case TelnetCommand.Break:
                     case TelnetCommand.InterruptProcess:
                     case TelnetCommand.AbortOutput:
                     case TelnetCommand.AreYouThere:
                     case TelnetCommand.EraseCharacter:
                     case TelnetCommand.EraseLine:
                     case TelnetCommand.GoAhead:
                         // TODO We recognize, but ignore these for now
                         _TelnetNegotiationState = TelnetNegotiationState.Data;
                         break;
                     case TelnetCommand.Do: _TelnetNegotiationState = TelnetNegotiationState.Do; break;
                     case TelnetCommand.Dont: _TelnetNegotiationState = TelnetNegotiationState.Dont; break;
                     case TelnetCommand.Will: _TelnetNegotiationState = TelnetNegotiationState.Will; break;
                     case TelnetCommand.Wont: _TelnetNegotiationState = TelnetNegotiationState.Wont; break;
                     case TelnetCommand.Subnegotiation:
                         _TelnetNegotiationState = TelnetNegotiationState.Subnegotiation;
                         _SubnegotiationData.Length = 0;
                         break;
                     default: _TelnetNegotiationState = TelnetNegotiationState.Data; break;
                 }
             }
         }
         else if (_TelnetNegotiationState == TelnetNegotiationState.Do)
         {
             switch ((TelnetOption)data[i])
             {
                 case TelnetOption.TransmitBinary: SendWill(data[i]); break;
                 case TelnetOption.Echo: SendWill(data[i]); break;
                 case TelnetOption.SuppressGoAhead: SendWill(data[i]); break;
                 case TelnetOption.WindowSize: SendWont(data[i]); break;
                 case TelnetOption.TerminalType: SendWont(data[i]); break;
                 case TelnetOption.LineMode: SendWont(data[i]); break;
                 default: SendWont(data[i]); break;
             }
             _TelnetNegotiationState = TelnetNegotiationState.Data;
         }
         else if (_TelnetNegotiationState == TelnetNegotiationState.Dont)
         {
             switch ((TelnetOption)data[i])
             {
                 case TelnetOption.TransmitBinary: SendWill(data[i]); break;
                 case TelnetOption.Echo: SendWill(data[i]); break;
                 case TelnetOption.SuppressGoAhead: SendWill(data[i]); break;
                 case TelnetOption.WindowSize: SendWont(data[i]); break;
                 case TelnetOption.TerminalType: SendWont(data[i]); break;
                 case TelnetOption.LineMode: SendWont(data[i]); break;
                 default: SendWont(data[i]); break;
             }
             _TelnetNegotiationState = TelnetNegotiationState.Data;
         }
         else if (_TelnetNegotiationState == TelnetNegotiationState.Will)
         {
             switch ((TelnetOption)data[i])
             {
                 case TelnetOption.TransmitBinary: SendDo(data[i]); break;
                 case TelnetOption.Echo: SendDont(data[i]); break;
                 case TelnetOption.SuppressGoAhead: SendDo(data[i]); break;
                 case TelnetOption.WindowSize: SendDont(data[i]); break;
                 case TelnetOption.TerminalType: SendSubnegotiate(data[i]); break;
                 case TelnetOption.LineMode: SendDont(data[i]); break;
                 default: SendDont(data[i]); break;
             }
             _TelnetNegotiationState = TelnetNegotiationState.Data;
         }
         else if (_TelnetNegotiationState == TelnetNegotiationState.Wont)
         {
             switch ((TelnetOption)data[i])
             {
                 case TelnetOption.TransmitBinary: SendDont(data[i]); break;
                 case TelnetOption.Echo: SendDont(data[i]); break;
                 case TelnetOption.SuppressGoAhead: SendDo(data[i]); break;
                 case TelnetOption.WindowSize: SendDont(data[i]); break;
                 case TelnetOption.TerminalType: SendDont(data[i]); break;
                 case TelnetOption.LineMode: SendDont(data[i]); break;
                 default: SendDont(data[i]); break;
             }
             _TelnetNegotiationState = TelnetNegotiationState.Data;
         }
         // TODO Port to fTelnet, HtmlTerm
         else if (_TelnetNegotiationState == TelnetNegotiationState.Subnegotiation)
         {
             // First byte of subnegotiation should be the option to negotiate
             switch ((TelnetOption)data[i])
             {
                 case TelnetOption.TerminalType:
                 case TelnetOption.WindowSize:
                     // Known option
                     _SubnegotiationOption = (TelnetOption)data[i];
                     break;
                 default:
                     // Unknown option
                     _SubnegotiationOption = TelnetOption.None;
                     break;
             }
             _TelnetNegotiationState = TelnetNegotiationState.SubnegotiationData;
         }
         else if (_TelnetNegotiationState == TelnetNegotiationState.SubnegotiationData)
         {
             // Add next byte to negotiation string, unless it's an IAC
             switch ((TelnetCommand)data[i])
             {
                 case TelnetCommand.IAC: _TelnetNegotiationState = TelnetNegotiationState.SubnegotiationIAC; break;
                 default: _SubnegotiationData.Append((char)data[i]); break;
             }
         }
         else if (_TelnetNegotiationState == TelnetNegotiationState.SubnegotiationIAC)
         {
             // Check to see if negotiation has ended, or if it's just a doubled IAC
             switch ((TelnetCommand)data[i])
             {
                 case TelnetCommand.IAC:
                     // Doubled IAC means go back to data
                     _SubnegotiationData.Append((char)data[i]);
                     _TelnetNegotiationState = TelnetNegotiationState.SubnegotiationData;
                     break;
                 case TelnetCommand.EndSubnegotiation:
                     // Subnegotiation has ended
                     // TODO Do something with FSubnegotiationData based on FSubnegotiationOption
                     switch (_SubnegotiationOption)
                     {
                         case TelnetOption.TerminalType:
                             // TODO
                             break;
                         case TelnetOption.WindowSize:
                             // TODO
                             break;
                     }
                     _TelnetNegotiationState = TelnetNegotiationState.Data;
                     break;
                 default:
                     // Something unknown has happened
                     _TelnetNegotiationState = TelnetNegotiationState.Data;
                     break;
             }
         }
         else
         {
             _TelnetNegotiationState = TelnetNegotiationState.Data;
         }
     }
 }
コード例 #27
0
ファイル: TelnetConnection.cs プロジェクト: bravesoftdz/RMLib
 public void SendSubnegotiate(TelnetOption option)
 {
     SendSubnegotiate((byte)option);
 }
コード例 #28
0
ファイル: Telnet.cs プロジェクト: FNKGino/poderosa
 public void Write(TelnetCode code, TelnetOption opt)
 {
     _strm.WriteByte((byte)TelnetCode.IAC);
     _strm.WriteByte((byte)code);
     _strm.WriteByte((byte)opt);
 }
コード例 #29
0
ファイル: TelnetConnection.cs プロジェクト: bravesoftdz/RMLib
 public void SendWill(TelnetOption option)
 {
     SendIAC(TelnetCommand.Will, option);
 }
コード例 #30
0
ファイル: TelnetConnection.cs プロジェクト: bravesoftdz/RMLib
 public void SendWont(TelnetOption option)
 {
     SendIAC(TelnetCommand.Wont, option);
 }
コード例 #31
0
ファイル: xConnection.cs プロジェクト: polytronicgr/GalaxyE
        private void ParseTelnetNegData()
        {
            byte[] negBuffer = tnNegCommands.ToArray();
            tnNegCommands.Clear();

            for (int i = 0; i < negBuffer.Length; i += 3)
            {
                if (negBuffer.Length - i < 3)
                {
                    break;
                }

                if (negBuffer[i] == (int)TelnetCommand.IAC)
                {
                    TelnetCommand command = (TelnetCommand)negBuffer[i + 1];
                    TelnetOption  option  = (TelnetOption)negBuffer[i + 2];

                    Console.WriteLine("CLIENT {0} {1}", command, option);

                    switch (command)
                    {
                    case TelnetCommand.WONT:
                        if (!ClientOptionNegociated((byte)option) || GetClientOption((byte)option))
                        {
                            server.Send(new byte[] { 255, (byte)TelnetCommand.DONT, (byte)option }, this);
                        }
                        Console.WriteLine("SERVER {0} {1}", TelnetCommand.DONT, option);
                        AddClientOption((byte)option, false);
                        this.sender.SendFailMessage(string.Format("Negotiating Client Option '{0}'", option), "OFF");
                        break;

                    case TelnetCommand.DONT:
                        if (!ServerOptionNegociated((byte)option) || GetServerOption((byte)option))
                        {
                            server.Send(new byte[] { 255, (byte)TelnetCommand.WONT, (byte)option }, this);
                        }
                        Console.WriteLine("SERVER {0} {1}", TelnetCommand.WONT, option);
                        AddServerOption((byte)option, false);
                        this.sender.SendFailMessage(string.Format("Negotiating Server Option '{0}'", option), "OFF");

                        if (option == TelnetOption.SuppressGoAhead)
                        {
                            //I WILL DISCONNECT ECHO ALSO!!!
                            server.Send(new byte[] {
                                (byte)TelnetCommand.IAC,
                                (byte)TelnetCommand.WONT,
                                (byte)TelnetOption.Echo
                            }, this);
                            AddServerOption((byte)TelnetOption.Echo, false);
                            this.sender.SendFailMessage(string.Format("Negotiating Server Option '{0}'", option), "OFF");
                            Console.WriteLine("SERVER {0} {1}", TelnetCommand.WONT, TelnetOption.Echo);
                        }

                        break;

                    case TelnetCommand.DO:
                        switch (option)
                        {
                        case TelnetOption.Echo:
                            if (!ServerOptionNegociated((byte)option) || !GetServerOption((byte)option))
                            {
                                server.Send(new byte[] {
                                    (byte)TelnetCommand.IAC,
                                    (byte)TelnetCommand.WILL,
                                    (byte)TelnetOption.Echo
                                }, this);
                            }

                            Console.WriteLine("SERVER {0} {1}", TelnetCommand.WILL, TelnetOption.Echo);
                            AddServerOption((byte)option, true);
                            this.sender.SendSucessMessage(string.Format("Negotiating Server Option '{0}'", option), "ON");
                            break;

                        case TelnetOption.SuppressGoAhead:
                            if (!ServerOptionNegociated((byte)option) || !GetServerOption((byte)option))
                            {
                                server.Send(new byte[] {
                                    (byte)TelnetCommand.IAC,
                                    (byte)TelnetCommand.WILL,
                                    (byte)TelnetOption.SuppressGoAhead
                                }, this);
                            }
                            Console.WriteLine("SERVER {0} {1}", TelnetCommand.WILL, TelnetOption.SuppressGoAhead);
                            AddServerOption((byte)option, true);
                            this.sender.SendSucessMessage(string.Format("Negotiating Server Option '{0}'", option), "ON");
                            break;
                        }
                        break;

                    case TelnetCommand.WILL:

                        switch (option)
                        {
                        case TelnetOption.SuppressGoAhead:
                            server.Send(new byte[] {
                                (byte)TelnetCommand.IAC,
                                (byte)TelnetCommand.DO,
                                (byte)TelnetOption.SuppressGoAhead
                            }, this);
                            Console.WriteLine("SERVER {0} {1}", TelnetCommand.DO, TelnetOption.SuppressGoAhead);
                            AddClientOption((byte)option, true);
                            this.sender.SendSucessMessage(string.Format("Negotiating Client Option '{0}'", option), "ON");
                            break;

                        case TelnetOption.Echo:
                            server.Send(new byte[] {
                                (byte)TelnetCommand.IAC,
                                (byte)TelnetCommand.DO,
                                (byte)TelnetOption.Echo
                            }, this);
                            Console.WriteLine("SERVER {0} {1}", TelnetCommand.DO, TelnetOption.Echo);
                            AddClientOption((byte)option, true);
                            this.sender.SendSucessMessage(string.Format("Negotiating Client Option '{0}'", option), "ON");
                            break;

                        case TelnetOption.WindowSize:
                            server.Send(new byte[] {
                                (byte)TelnetCommand.IAC,
                                (byte)TelnetCommand.DO,
                                (byte)TelnetOption.WindowSize
                            }, this);
                            Console.WriteLine("SERVER {0} {1}", TelnetCommand.DO, TelnetOption.WindowSize);
                            AddClientOption((byte)option, true);
                            this.sender.SendSucessMessage(string.Format("Negotiating Client Option '{0}'", option), "ON");
                            //server.Send(new byte[] {
                            //    (byte)TelnetCommand.IAC,
                            //    (byte)TelnetCommand.DO,
                            //    (byte)TelnetOption.DataEntryTerminal}, this);
                            //Console.WriteLine("SERVER {0} {1}", TelnetCommand.DO, TelnetOption.DataEntryTerminal);
                            break;

                        case TelnetOption.TerminalType:
                            server.Send(new byte[] {
                                (byte)TelnetCommand.IAC,
                                (byte)TelnetCommand.SB,
                                (byte)TelnetOption.TerminalType, 0x1,
                                (byte)TelnetCommand.IAC,
                                (byte)TelnetCommand.SE
                            }, this);
                            Console.WriteLine("SERVER {0} {1}", TelnetCommand.SB, TelnetOption.TerminalType);
                            AddClientOption((byte)option, true);
                            this.sender.SendSucessMessage(string.Format("Negotiating Client Option '{0}'", option), "ON");
                            break;

                        case TelnetOption.Charset:
                            server.Send(new byte[] {
                                (byte)TelnetCommand.IAC,
                                (byte)TelnetCommand.SB,
                                (byte)TelnetOption.Charset, 0x1,
                                (byte)'U', (byte)'T', (byte)'F', (byte)'-', (byte)'8',
                                (byte)TelnetCommand.IAC,
                                (byte)TelnetCommand.SE
                            }, this);
                            Console.WriteLine("SERVER {0} {1}", TelnetCommand.SB, TelnetOption.TerminalType);
                            AddClientOption((byte)option, true);
                            this.sender.SendSucessMessage(string.Format("Negotiating Client Option '{0}'", option), "ON");
                            break;
                        }
                        break;

                    case TelnetCommand.SB:
                        switch (option)
                        {
                        case TelnetOption.WindowSize:
                            int w = negBuffer[i + 3] << 4 | negBuffer[i + 4];
                            int h = negBuffer[i + 5] << 4 | negBuffer[i + 6];

                            this.terminalHeight = h;
                            this.terminalWidth  = w;

                            Console.WriteLine("Window Size: {0} {1}", w, h);
                            i = i + 6;
                            if (this.player == null || this.player.PlayerState != ioPlayer.PlayerStateEnum.WaitingForCommand)
                            {
                                this.sender.SendMessage(string.Format("Got Terminal Size: '{0}x{1}'", w, h));
                            }

                            break;

                        case TelnetOption.TerminalType:
                            byte        Opt     = negBuffer[i + 3];
                            List <byte> tType   = new List <byte>();
                            bool        isValid = false;
                            for (int ct = i + 4; ct < negBuffer.Length; ct++)
                            {
                                i = ct;
                                if (negBuffer[ct] == (byte)TelnetCommand.IAC &&
                                    ct + 1 < negBuffer.Length &&
                                    negBuffer[ct + 1] == (byte)TelnetCommand.SE)
                                {
                                    isValid = true;
                                    break;
                                }
                                else
                                {
                                    tType.Add(negBuffer[ct]);
                                }
                            }

                            string tt = Encoding.UTF8.GetString(
                                Encoding.Convert(encoding, Encoding.UTF8, tType.ToArray())).ToUpper();

                            if (isValid)
                            {
                                if (!terminalTypes.Contains(tt))
                                {
                                    terminalTypes.Add(tt);
                                    terminalType = tt;
                                    VerifyTerminalType();
                                    Console.WriteLine("Got known terminal type: {0}", tt);
                                    if (this.player == null || this.player.PlayerState != ioPlayer.PlayerStateEnum.WaitingForCommand)
                                    {
                                        this.sender.SendSucessMessage("Got known terminal type", tt);
                                    }
                                }
                                else
                                {
                                    VerifyTerminalType();
                                    Console.WriteLine("Got unknown Terminal type: {0}", tt);
                                    if (this.player == null || this.player.PlayerState != ioPlayer.PlayerStateEnum.WaitingForCommand)
                                    {
                                        this.sender.SendFailMessage("Got unknown terminal type", tt);
                                    }
                                }
                            }
                            else
                            {
                                Console.WriteLine("Terminal type: {0}", tt);
                                Console.WriteLine("WTF!!!!");
                                if (this.player == null || this.player.PlayerState != ioPlayer.PlayerStateEnum.WaitingForCommand)
                                {
                                    this.sender.SendFailMessage("Unable to decode terminal type", tt);
                                }
                            }



                            break;

                        case TelnetOption.Charset:
                            Console.WriteLine("Charset");
                            break;
                        }
                        break;
                    }
                }
            }

            //Console.WriteLine("----------------");
        }