




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
东北大学秦皇岛分校计算机与通信工程学院课程设计 计算机与通信工程学院 计算机网络课程设计 编程实现TELNET协议的基本功能专业名称计算机科学与技术班级学号4100507学生姓名陈小军指导教师 管莹设计时间2013.6.242013.7.4 课程设计任务书专业:计算机科学与技术 学号: 4100507 学生姓名:陈小军小组题目:编程实现TELNET协议的基本功能1、 TELNET协议允许用户用一台终端来访问远程的主机 ,它允许终端于主机之间以半双工的方式交换信息,可参阅RFC8646-13。本次设计要求利用VB实现TELNET协议的基本功能 2、任务分工: (1)、远程主机设置(ubuntu);(罗琪)(2)、设计原理分析,程序编写,报告书写;(王志成)(3)、程序编写、调试及截图;(赵晓鹏)(4)、程序编写、调试及截图。(陈小军)设计时间与安排1、设计时间: 2周2、设计时间安排: 2013.6.242013.7.7 熟悉实验设备、收集资料: 3 天设计图纸、实验、计算、程序编写调试: 8 天编写课程设计报告: 2 天答辩: 1 天(一)设计题目:TELNET(远程登录)协议(二)设计要求:TELNET协议允许用户用一台终端来访问远程的主机 ,它允许终端于主机之间以半双工的方式交换信息,可参阅RFC8646-13。本次设计要求利用VB实现TELNET协议的基本功能 (三)协议介绍:3.1 简介Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。3.2 登录先来看看什么叫登录:分时系统允许多个用户同时使用一台计算机,为了保证系统的安全和记账方便,系统要求每个用户有单独的帐号作为登录标识,系统还为每个用户指定了一个口令。用户在使用该系统之前要输入标识和口令,这个过程被称为登录。远程登录是指用户使用Telnet命令,使自己的计算机暂时成为远程主机的一个仿真终端的过程。仿真终端等效于一个非智能的机器,它只负责把用户输入的每个字符传递给主机,再将主机输出的每个信息回显在屏幕上。3.3 工作过程使用Telnet协议进行远程登录时需要满足以下条件:在本地计算机上必须装有包含Telnet协议的客户程序;必须知道远程主机的Ip地址或域名;必须知道登录标识与口令。Telnet远程登录服务分为以下4个过程:1)本地与远程主机建立连接。该过程实际上是建立一个TCP连接,用户必须知道远程主机的Ip地址或域名;2)将本地终端上输入的用户名和口令及以后输入的任何命令或字符以NVT(Net Virtual Terminal)格式传送到远程主机。该过程实际上是从本地主机向远程主机发送一个IP数据包;3)将远程主机输出的NVT格式的数据转化为本地所接受的格式送回本地终端,包括输入命令回显和命令执行结果;4)最后,本地终端对远程主机进行撤消连接。该过程是撤销一个TCP连接。3.4 基本概念telnet协议建立在三个主要的思想之上:(1) 虚拟终端(2) 选项协商方法(3) 通信双方地位对等3.4.1 NVT (网络虚拟终端) Telnet使用网络虚拟终端字符集来处理异构系统的远程登录问题。网络虚拟终端字符集是一个通用借口,通过该借口,Telent客户端将来自本地终端的字符(数据或命令)转换成NVT形式,然后交付网络。而Telnet服务器讲来自NVT形式的字符(数据或命令)转换成计算机可接受的形式。3.4.2 选项协商双方在进行Telnet连接时,要进行选项协商.比如:使用字符方式 窗口的大小,终端的类型都要进行协商.而协商是通过TELNET所支持的命令来实现的.TELNET的常用命令(具体的见TCP/IP详解P303):SE 240(F0) 子选项结束SB 250(FA) 子选项开始IAC 255(FF) 选项协商的第一个字节WILL 251(FB) 发送方激活选项(接收方同意激活选项)DO 253(FD) 接收方同意(发送方想让接收方激活选项)WONT 252(FC) 接收方不同意DONT 254(FE) 接受方回应WONT例如: “WILL X”表示“你是否同意我使用X 选项” “DO X ”表示“我同意你使用X 选项”TELNET的常用选项代码1(0x01) 回显(echo)3(0x03) 抑制继续进行(传送一次一个字符方式可以选择这个选项)24(0x18) 终端类型31(0x1F) 窗口大小32(0x20) 终端速率33(0x21) 远程流量控制34(0x22) 行方式36(0x24) 环境变量协商流程图3.4.3 对称性由于进行选项协商的两端是完全对称的,任意一端都有可能将对方的确认命令当成是请求命令而再次发出响应命令,这样就会造成协商过程的无限循环(loop)。因此为了避免循环的发生,协商过程应遵循下面三个规则:(1) 只为选项的变化发出请求:(2) 接收到的请求如果要求进入已经具有的状态,那么此请求将不被响应:(3) 当一端向另一端发送一个协商命令时,(不管这个命令是请求还是响应命令),如果该选项的使用将影响到对方接受数据的处理,那么这个命令应该被插入到该选项开始起作用的数据流的首部。3.5 Telnet命令格式:telnet 选项 主机名(IP地址)选项包括:-8 采用8位二进制传输-E 屏蔽所有的退出-L 使用8位二进制输出-a 自动登录-d 开关DEBUG信息,可从/usr/adm/syslog中看到(UNIX)-e ESCAPE_CHAR 设置退出字符-l USER 自动登录时作为用户名常用命令help 联机求助open后接IP地址或域名 即可进行远程登录close 正常结束远程会话,回到命令方式display 显示工作参数mode 进入行命令或字符方式send 向远程主机传送特殊字符(键入send?可显示详细字符)set 设置工作参数(键入set?可显示详细参数)status 显示状态信息toggle 改变工作参数(键入toggle?可显示详细参数)换码符(escape character), 在异常情况下退出会话,回到命令方式quit退出telnet,返回本地机z使telnet进入暂停状态;结束命令方式,返回telnet的会话方式(四)实现telnet协议 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net;using System.Net.Sockets;using System.Collections;namespace telnet class Program #region 定义一些变量 / / 定义一些标识符。 / readonly Char IAC = Convert.ToChar(255);/标识符,代表是一个TELNET指令 readonly Char DO = Convert.ToChar(253);/表示一方要求另一方使用,或者确认你希望另一方使用指定的选项。 readonly Char DONT = Convert.ToChar(254);/ 表示一方要求另一方停止使用,或者确认你不再希望另一方使用指定的选项。 readonly Char WILL = Convert.ToChar(251);/ 表示希望开始使用或者确认所使用的是指定的选项。 readonly Char WONT = Convert.ToChar(252);/表示拒绝使用或者继续使用指定的选项 readonly Char SB = Convert.ToChar(250);/表示后面所跟的是对需要的选项的子谈判 readonly Char SE = Convert.ToChar(240);/子谈判参数的结束 const Char IS = 0; const Char SEND = 1; const Char INFO = 2; const Char VAR = 0; const Char VALUE = 1; const Char ESC = 2; const Char USERVAR = 3; byte m_byBuff = new byte100000;/流 private ArrayList m_ListOptions = new ArrayList(); /收到的控制信息 string m_strResp;/存储准备发送的信息 private Socket s;/一个套接字 #endregion static void Main(string args) Console.Title = telnet-4100507-chenxiaojun; / Console.BackgroundColor = ConsoleColor.Green; Console.ForegroundColor = ConsoleColor.Red; /实例化这个对象 Program p = new Program(); /启动socket进行telnet连接 p.doSocket(); / / 启动scocket,进行telnet操作 / private void doSocket() Console.WriteLine(服务器端地址:); /输入ip地址 IPAddress import = IPAddress.Parse(Console.ReadLine(); /获得端口号 Console.WriteLine(服务器端口号:); int port =int.Parse(Console.ReadLine(); /建立一个socket对象,使用ipv4,使用流进行连接,使用tcp/ip协议 s =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp ); /获得一个连接地址对象(由ip地址和端口号构成) IPEndPoint address =new IPEndPoint(import,port); /说明此socket不是出于阻止模式 s.Blocking=false; s.BeginConnect(address, delegate(IAsyncResult ar) try /获得传入的对象(此处对象是beingconnect的第三个参数) Socket sock1 =(Socket)ar.AsyncState; if(sock1.Connected) AsyncCallback recieveData = new AsyncCallback(OnRecieveData); sock1.BeginReceive(m_byBuff,0,m_byBuff.Length,SocketFlags.None,recieveData,sock1); catch(Exception ex) Console.WriteLine(初始化接收信息出错:+ex.Message); ,s); /此处是为了发送指令不停的循环 发送要登录的账户和密码等。 while (true) /发送读出的数据 DispatchMessage(Console.ReadLine (); /因为回车都没有发送,在此处不上 DispatchMessage(rn); / right / / 当接收完成后,执行的方法 / / private void OnRecieveData(IAsyncResult ar) /从参数中获得给的sockrt对象 Socket sock =(Socket)ar.AsyncState; int nBytesRec =sock.EndReceive(ar); /如果有数据 if (nBytesRec 0) /讲接收到的数据转码,顺便转成string 型 string sReceive = Encoding.GetEncoding(utf-8).GetString(m_byBuff, 0, nBytesRec); /声明一个字符串,用来存贮解析过的字符串 string m_strLine = ; for (int i = 0; i nBytesRec; i+) Char ch = Convert.ToChar(m_byBuffi); switch (ch) case r: m_strLine += Convert.ToString(rn); break; case n: break; default: m_strLine += Convert.ToString(ch); break; try int strLinelen = m_strLine.Length; if (strLinelen = 0) m_strLine = Convert.ToString(rn); /建立一个流,把接收的信息存进mToProcess中 Byte mToProcess = new BytestrLinelen; for (int i = 0; i strLinelen; i+) mToProcessi = Convert.ToByte(m_strLinei); /对接收的信息进行处理 string mOutText = ProcessOptions(mToProcess); if (mOutText != ) Console.Write(mOutText); /接收完数据,处理完字符串数据等一系列事物之后,开始回发数据 RespondToOptions(); catch (Exception ex) throw new Exception(接收数据的时候出错了! + ex.Message); else/ 如果没有接收到任何数据的话 / 输出 关闭连接 Console.WriteLine(Disconnected, sock.RemoteEndPoint); / 关闭socket sock.Shutdown(SocketShutdown.Both); sock.Close(); Console.Write(Game Over); Console.ReadLine(); /right / / 发送数据的函数 / private void RespondToOptions() try /声明一个字符串,来存储 接收到的参数 string strOption; for (int i = 0; i m_ListOptions.Count; i+) /获得一个控制信息参数 strOption = (string)m_ListOptionsi; /根据这个参数,进行处理 ArrangeReply(strOption); DispatchMessage(m_strResp); m_strResp = ; m_ListOptions.Clear(); catch (Exception ers) Console.WriteLine(错错了,在回发数据的时候 + ers.Message); /right /解析接收的数据,生成最终用户看到的有效文字,同时将附带的参数存储起来 private string ProcessOptions(byte m_strLineToProcess) string m_DISPLAYTEXT = ; string m_strTemp = ; string m_strOption = ; string m_strNormalText = ; bool bScanDone = false; int ndx = 0; int ldx = 0; char ch; try /把数据从byte 转化成string for (int i = 0; i lensmk) ndx = m_strTemp.Length; if (ndx != -1) #region / 将 标志位IAC 的字符 赋值给最终显示文字 m_DISPLAYTEXT += m_strTemp.Substring(0, ndx); / 此处获得命令码 ch = m_strTempndx + 1; if (ch = DO | ch = DONT | ch = WILL | ch = WONT) m_strOption = m_strTemp.Substring(ndx, 3); m_ListOptions.Add(m_strOption); / 将 标志位IAC 的字符 赋值给最终显示文字 m_DISPLAYTEXT += m_strTemp.Substring(0, ndx); string txt = m_strTemp.Substring(ndx + 3); m_strTemp = txt; /如果IAC后面又跟了个IAC (255) else if (ch = IAC) /则显示从输入的字符串头开始,到之前的IAC 结束 m_DISPLAYTEXT = m_strTemp.Substring(0, ndx); /之后将处理过的字符串排除出去 m_strTemp = m_strTemp.Substring(ndx + 1); /如果IAC后面跟的是SB(250) else if (ch = SB) m_DISPLAYTEXT = m_strTemp.Substring(0, ndx); ldx = m_strTemp.IndexOf(Convert.ToString(SE); m_strOption = m_strTemp.Substring(ndx, ldx); m_ListOptions.Add(m_strOption); m_strTemp = m_strTemp.Substring(ldx); #endregion /若字符串里已经没有IAC标志位了 else m_DISPLAYTEXT = m_DISPLAYTEXT + m_strTemp; bScanDone = true; m_strNormalText = m_DISPLAYTEXT; catch (Exception eP) throw new Exception(解析传入的字符串错误: + eP.Message); return m_strNormalText; / right #region magic Function /解析传过来的参数,生成回发的数据到m_strResp private void ArrangeReply(string strOption) try Char Verb; Char Option; Char Modifier; Char ch; bool bDefined = false; if (strOption.Length 3) return; Verb = strOption1; Option = strOption2; /如果选项码为 回显(1) 或者是抑制继续进行(3) if (Option = 1 | Option = 3) bDefined = true; m_strResp += IAC; /如果选项码为 回显(1) 或者是抑制继续进行(3) =true if (bDefined = true) #region 继续判断 if (Verb = DO) ch = WILL; m_strResp += ch; m_strResp += Option; if (Verb = DONT) ch = WONT; m_strResp += ch; m_strResp += Option; if (Verb = WILL) ch = DO; m_strResp += ch; m_strResp += Option; if (Verb = WONT) ch = DONT; m_strResp += ch; m_strResp += Option; if (Verb = SB) Modifier = strOption3; if (Modifier = SEND) ch = SB; m_strResp += ch; m_strResp += Option; m_strResp += IS; m_strResp += IAC; m_strResp += SE; #endregion else #region 底下一系列代表,无论你发那种请求,我都不干 if (Verb = DO) ch = WONT; m_strResp += ch; m_strResp += Option; if (Verb = DONT) ch = WONT; m_strResp += ch; m_str
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 混合云架构优化-第1篇-洞察及研究
- 河南对外经济贸易职业学院《食品消费者行为及市场营销学》2023-2024学年第二学期期末试卷
- 疾病微生物组动态变化-洞察及研究
- 上海行健职业学院《中学英语教材分析理论教学》2023-2024学年第二学期期末试卷
- 复旦大学《民俗学》2023-2024学年第二学期期末试卷
- 许昌陶瓷职业学院《农产品市场营销》2023-2024学年第二学期期末试卷
- 职场情景题目及答案
- 整式的题目及答案
- 华科大工程传热学教案02稳态导热
- 育婴员考试试题及答案
- 喘息性支气管肺炎护理
- 《小儿腹痛》课件
- 《无人机飞行操控技术》项目5 无人直升机飞行操控
- 行政职业能力测验公务员考试行测试卷及答案指导(2025年)
- 夏令营安全管理工作制度
- 2024年黑龙江、吉林、辽宁高考生物试卷(含答案解析)
- 5【选必下】高中语文部编版教材选必下册课内文言文精练
- 中医疾病症状评分总表(终极版)
- 实验室安全教育课件
- 透析病人不安腿综合征
- 市政病媒生物防制基础知识练习题及答案(200题)
评论
0/150
提交评论