/// <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; }
/// <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; }
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; }
/// <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; }
public TelnetCommandBuilder Add(TelnetVerb verb, TelnetOption option) { _data.Add((byte)TelnetVerb.IAC); _data.Add((byte)verb); _data.Add((byte)option); return(this); }
/// <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); }
/// <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); }
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); }
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; } }
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; } }
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); }
/// <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); } }
/// <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); }
// 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(); } }
/// <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); } } }
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()); } }
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; } } }
private void SendIAC(TelnetCommand command, TelnetOption option) { SendIAC(command, (byte)option); }
public void SendWont(TelnetOption option) { SendIAC(TelnetCommand.Wont, option); }
public void SendSubnegotiate(TelnetOption option) { SendSubnegotiate((byte)option); }
public void Write(TelnetCode code, TelnetOption opt) { _strm.WriteByte((byte)TelnetCode.IAC); _strm.WriteByte((byte)code); _strm.WriteByte((byte)opt); }
public void SendDo(TelnetOption option) { SendIAC(TelnetCommand.Do, option); }
public void SendWill(TelnetOption option) { SendIAC(TelnetCommand.Will, option); }
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("----------------"); }