/// <summary> /// 応答送信(SB) /// </summary> /// <param name="client"></param> /// <param name="info"></param> private void ResponseSB(Common.Net.TelnetClient client, TelnetNegotiationInfomation info) { // オプション毎に分岐 switch (info.Option) { case TelnetOption.terminal_type: // TODO:未実装 if (info.Stream.Length > 0 && info.Stream.ToArray()[0] == 0x01) { client.SendAsync(SendTerminalType()); } break; case TelnetOption.window_size: // TODO:未実装 client.SendAsync(SendWinSize()); break; case TelnetOption.terminal_speed: // TODO:未実装 if (info.Stream.Length > 0 && info.Stream.ToArray()[0] == 0x01) { client.SendAsync(SendTerminalSpeed()); } break; default: break; } }
/// <summary> /// ネゴシエーション応答送信 /// </summary> /// <param name="client"></param> /// <param name="infoList"></param> /// <returns></returns> public void NegotiationResponse(Common.Net.TelnetClient client, List <TelnetNegotiationInfomation> infoList) { // リスト数分繰返し foreach (TelnetNegotiationInfomation info in infoList) { // コマンド毎に分岐 switch (info.Command) { case TelnetCommand.DO: // 応答送信(DO) this.ResponseDO(client, info); break; case TelnetCommand.DONT: // 応答送信(DONT) this.ResponseDONT(client, info); break; case TelnetCommand.WILL: // 応答送信(WILL) this.ResponseWILL(client, info); break; case TelnetCommand.WONT: // 応答送信(WONT) this.ResponseWONT(client, info); break; case TelnetCommand.SB: // 応答送信(SB) this.ResponseSB(client, info); break; case TelnetCommand.SE: // 応答送信(SE) this.ResponseSE(client, info); break; default: // 異常終了 break; } } }
/// <summary> /// 応答送信(SE) /// </summary> /// <param name="client"></param> /// <param name="info"></param> private void ResponseSE(Common.Net.TelnetClient client, TelnetNegotiationInfomation info) { }
/// <summary> /// 応答送信(WONT) /// </summary> /// <param name="client"></param> /// <param name="info"></param> private void ResponseWONT(Common.Net.TelnetClient client, TelnetNegotiationInfomation info) { if (info.Option <= TelnetOption.max) { switch (this.m_Remote[info.Option].Status) { case TelnetOptionStatus.Yes: this.m_Remote[info.Option].Status = TelnetOptionStatus.No; client.SendAsync(SendBack(TelnetCommand.DONT, info.Option)); break; case TelnetOptionStatus.WantNo: switch (this.m_Remote[info.Option].Queue) { case TelnetOptionQueue.Empty: this.m_Remote[info.Option].Status = TelnetOptionStatus.No; break; case TelnetOptionQueue.Opposite: this.m_Remote[info.Option].Status = TelnetOptionStatus.WantYes; this.m_Remote[info.Option].Queue = TelnetOptionQueue.Empty; client.SendAsync(SendBack(TelnetCommand.DO, info.Option)); break; } break; case TelnetOptionStatus.WantYes: switch (this.m_Remote[info.Option].Queue) { case TelnetOptionQueue.Empty: this.m_Remote[info.Option].Status = TelnetOptionStatus.No; break; case TelnetOptionQueue.Opposite: this.m_Remote[info.Option].Status = TelnetOptionStatus.No; this.m_Remote[info.Option].Queue = TelnetOptionQueue.Empty; break; } break; } } else { client.SendAsync(SendBack(TelnetCommand.DONT, info.Option)); } switch (info.Option) { case TelnetOption.echo: if (this.m_TelEcho) { switch (this.m_Remote[TelnetOption.echo].Status) { case TelnetOptionStatus.Yes: this.m_LocalEcho = 0; break; case TelnetOptionStatus.No: this.m_LocalEcho = 1; break; } } if (this.m_Remote[TelnetOption.echo].Status == TelnetOptionStatus.Yes) { this.m_TelLineMode = false; } break; case TelnetOption.binary: switch (this.m_Remote[TelnetOption.binary].Status) { case TelnetOptionStatus.Yes: this.m_TelBinRecv = true; break; case TelnetOptionStatus.No: this.m_TelBinRecv = false; break; } break; } }
/// <summary> /// 応答送信(DONT) /// </summary> /// <param name="client"></param> /// <param name="info"></param> private void ResponseDONT(Common.Net.TelnetClient client, TelnetNegotiationInfomation info) { if (info.Option <= TelnetOption.max) { switch (this.m_Local[info.Option].Status) { case TelnetOptionStatus.Yes: this.m_Local[info.Option].Status = TelnetOptionStatus.No; client.SendAsync(SendBack(TelnetCommand.WONT, info.Option)); break; case TelnetOptionStatus.WantNo: switch (this.m_Local[info.Option].Queue) { case TelnetOptionQueue.Empty: this.m_Local[info.Option].Status = TelnetOptionStatus.No; break; case TelnetOptionQueue.Opposite: this.m_Local[info.Option].Status = TelnetOptionStatus.WantYes; this.m_Local[info.Option].Queue = TelnetOptionQueue.Empty; client.SendAsync(SendBack(TelnetCommand.WILL, info.Option)); break; } break; case TelnetOptionStatus.WantYes: switch (this.m_Local[info.Option].Queue) { case TelnetOptionQueue.Empty: this.m_Local[info.Option].Status = TelnetOptionStatus.No; break; case TelnetOptionQueue.Opposite: this.m_Local[info.Option].Status = TelnetOptionStatus.No; this.m_Local[info.Option].Queue = TelnetOptionQueue.Empty; break; } break; } } else { client.SendAsync(SendBack(TelnetCommand.WONT, info.Option)); } switch (info.Option) { case TelnetOption.binary: switch (this.m_Local[TelnetOption.binary].Status) { case TelnetOptionStatus.Yes: this.m_TelBinSend = true; break; case TelnetOptionStatus.No: this.m_TelBinSend = false; break; } break; } }
/// <summary> /// 応答送信(DO) /// </summary> /// <param name="client"></param> /// <param name="info"></param> private void ResponseDO(Common.Net.TelnetClient client, TelnetNegotiationInfomation info) { if (info.Option <= TelnetOption.max) { // オプション状態で分岐 switch (this.m_Local[info.Option].Status) { case TelnetOptionStatus.No: if (this.m_Local[info.Option].Accept) { this.m_Local[info.Option].Status = TelnetOptionStatus.Yes; client.SendAsync(SendBack(TelnetCommand.WILL, info.Option)); } else { client.SendAsync(SendBack(TelnetCommand.WONT, info.Option)); } break; case TelnetOptionStatus.WantNo: switch (this.m_Local[info.Option].Queue) { case TelnetOptionQueue.Empty: this.m_Local[info.Option].Status = TelnetOptionStatus.No; break; case TelnetOptionQueue.Opposite: this.m_Local[info.Option].Status = TelnetOptionStatus.Yes; break; } break; case TelnetOptionStatus.WantYes: switch (this.m_Local[info.Option].Queue) { case TelnetOptionQueue.Empty: this.m_Local[info.Option].Status = TelnetOptionStatus.Yes; break; case TelnetOptionQueue.Opposite: this.m_Local[info.Option].Status = TelnetOptionStatus.WantNo; this.m_Local[info.Option].Queue = TelnetOptionQueue.Empty; client.SendAsync(SendBack(TelnetCommand.WONT, info.Option)); break; } break; } } else { client.SendAsync(SendBack(TelnetCommand.WONT, info.Option)); } switch (info.Option) { case TelnetOption.binary: switch (this.m_Local[TelnetOption.binary].Status) { case TelnetOptionStatus.Yes: this.m_TelBinSend = true; break; case TelnetOptionStatus.No: this.m_TelBinSend = false; break; } break; case TelnetOption.window_size: if (this.m_Local[TelnetOption.window_size].Status == TelnetOptionStatus.Yes) { client.SendAsync(SendWinSize()); } break; case TelnetOption.suppress_go_ahead: if (this.m_Local[TelnetOption.suppress_go_ahead].Status == TelnetOptionStatus.Yes) { this.m_TelLineMode = false; } break; } }