




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高等计算机网络 Telnet客户端实现 姓 名: 陈学龙 学 号: SX1116083 指导教师: 钱红燕 日 期: 2011年11月目录一. 实验内容及目的3二. 开发语言及环境3三. 相关知识33.1 远程登录33.2 Telnet协议33.2.1 Telnet概述33.2.2 Telnet选项协商43.2.3 协商子选项53.2.4 网络虚拟终端(NVT)53.2.5 Telnet命令模式5四. 系统设计6五. 系统实现(主要函数源代码)7六. 运行结果17七. 存在的不足20一. 实验内容及目的(1)掌握网络通信程序的编写;(2)理解TELNET协议,掌握TELNET选项协商,协商子选项,命令模式及编码规则和其他必要的服务,理解NVT的含义及作用;(3)实现Telnet客户端,能够与Telnet服务器进行远程终端登录的访问。二. 开发语言及环境采用 C#语言进行程序编写,在Visual Studio 2005集成开发环境上对程序进行编译,测试和运行等。三. 相关知识3.1 远程登录“远程登录”就是用户把本地计算机与远程计算机连接起来,然后使用远程计算机系统的资源或其他服务。“远程登录”主要有两种实现方式:(1)通过Telnet方法实现远程登录。在Internet上,通常使用Telnet工具软件实现远程登录,所以习惯上把远程登录称为Telnet。Telnet是提供远程功能的应用标准,几乎每一个TCP/IP的实现都有这个功能,它能够运行在不同的操作系统的主机之间。(2)通过Rlogin方法实现远程登录。Rlogin起源于伯克利UNIX,开始只能工作在UNIX操作系统之间,现在可以在其他操作系统上运行。3.2 Telnet协议3.2.1 Telnet概述Telnet是支持远程登录的通信协议,它属于TCP/IP通信协议的终端协议部分。Telnet软件使用TCP/IP在用户计算机和远程宿主计算机之间建立一条通信线路,使终端设备通过线路与远程主机连接,提供虚拟终端服务。Telnet提供一组命令,作为用户远程登录使用的工具。Telnet系统主要由Telnet服务器和Telnet客户端组成,Telnet服务器是指能够提供Telnet服务的机器,Telnet客户端是指通过Telnet协议连接Telnet服务器的终端。Telnet协议端口号为23。应用Telnet协议能够把本地用户所使用的计算机变成远程主机系统的一个终端。它提供了三种基本服务:(1)Telnet定义一个网络虚拟终端为远程系统提供一个标准接口。客户机程序不必详细了解远程系统,他们只需构造使用标准接口的程序;(2)Telnet包括一个允许客户机和服务器协商选项的机制,而且它还提供一组标准选项;(3)Telnet对称处理连接的两端,即Telnet不强迫客户机从键盘输入,也不强迫客户机在屏幕上显示输出。3.2.2 Telnet选项协商Telnet协议是个简单的远程登录协议,其连接过程可以分为以下几个步骤:(1)进行选项协商(Option Negotiation);(2)本地用户在本地终端上对远程系统进行登录;(3)将本地终端上的键盘输入逐键传到远端;(4)将远端的输出送回本地终端。选项协商是对称的,任何一方都可以主动发送选项协商请求给对方。通过协商,Telnet客户机和Telnet服务器还可以使用更多的终端功能。一个选项协商需要3个字节,其定义如下:IAC 协商命令 协商选项其中,第一个字节是IAC命令。Telnet将十进制值为255的代码规定为IAC(Interpret As Command),这是一个特殊的代码,另外,凡出现在IAC之后的字节就是Telnet的命令。所以如果要发送的数据中恰好出现IAC,则在它的前面要增加一个IAC,当在收到数据中出现一连两个IAC时,就去掉一个,剩下的一个就是数据。第二个字节是协商命令。对于任何给定的选项,连接的任何一方都可以发送下面4种请求的任意一个请求。l WILL:发送方本身想激活选项。l WONT:发送方本身想禁止选项。l DO:发送方想叫接收端激活选项。l DONT:发送方想让接收端禁止选项。以上的WILL,WONT,DO和DONT是Telnet的协商命令,它们的十进制值分别是251254。Telnet规则规定,对于激活选项命令,可以选择同意或者不同意。而对于使选项失效命令则必须同意。4种请求共6种情况,如下表:发送方接收方含义WILLDO发送方想激活选项,接收方说同意WILLDONT发送方想激活选项,接收方说不同意DOWILL发送方想让接收方激活选项,接收方说同意DOWONT发送方想让接收方激活选项,接收方说不同意WONTDONT发送方想禁止选项,接收方必须说同意DONTWONT发送方想让接收方禁止选项,接收方须说同意3.2.3 协商子选项通常进行协商选项的时候,可能还需要进行下一级的协商。因此有些协商请求可能不仅仅是要激活或者禁止一个选项,而是需要对方返回相应的数据。如指定终端类型,如果用户发出要求终端类型的请求,则服务器端不能简单地返回同意或者不同意,如果接收请求,还需要发送具体的终端类型给对方。通常是如下格式: 发送方:IAC SB 子选项 SEDN IAC SE 接收方:IAC SB 子选项 子选项内容 IAC SE其中,第2个字节SB表示子选项的开始,字节SEND表示“发送”,字节IS 表示“是”,字节SE表示子选项的结束。是协商终端类型的过下面程: 发送:IAC SB TERMINAL-TYPE SEND IAC SE 应答:IAC SB TERMINAL-TYPE IS “IBMPC” IAC SE其中,TERMINAL-TYPE是终端类型选项,即发送方要求发送终端类型,接收方告诉自己的终端类型为“IBMPC”。3.2.4 网络虚拟终端(NVT)为了使多个操作系统间的Telnet交互操作成为可能,就必须详细了解异构计算机和操作系统。比如,一些操作系统需要每行文本用ASCII回车控制符(CR)结束,另一些系统则需要使用ASCII换行符(LF),还有一些系统需要用两个字符的序列回车-换行(CR-LF);再比如,大多数操作系统为用户提供了一个中断程序运行的快捷键,但这个快捷键在各个系统中有可能不同(一些系统使用CTRL+C,而另一些系统使用ESCAPE)。如果不考虑系统间的这种异构性,那么在本地发出的字符或命令,传送到远地并被远地系统解释后很可能会不准确或者出现错误。因此,Telnet协议必须解决这个问题。为了适应异构环境,Telnet协议定义了数据和命令在Internet上的传输方式,此定义被称作网络虚拟终端NVT(Net Virtual Terminal)。它的应用过程如下:对于发送的数据:客户机软件把来自用户终端的按键和命令序列转换为NVT格式,并发送到服务器,服务器软件将收到的数据和命令,从NVT格式转换为远地系统需要的格式; 对于返回的数据:远地服务器将数据从远地机器的格式转换为NVT格式,而本地客户机将将接收到的NVT格式数据再转换为本地的格式。3.2.5 Telnet命令模式Telnet的服务器和Telnet客户端有4种操作方式:半双工,一次一个字符方式,一次一行方式和行方式。l 半双工方式:这种方式中网络虚拟设备被默认为一个半双工设备。在接收用户输入之前,必须从服务器进程获得Go Ahead(GA)命令,用户的输入会在本地显示。客户端只能发送整行数据。目前很少使用。l 一次一行方式:又叫做准行方式。在一次一个字符方式中SGA和ECHO选项都必须有效,如果其中的任何一个被禁止,就变成了一次一行方式。l 行方式:通过客户端和服务器端进行协商确定,纠正了准行方式的所有缺陷。目前比较新的Telnet实现都支持这种方式。l 一次一个字符方式:是目前大多数Telnet的默认方式,每个键入的字符都单独发送到服务器进程,如果服务器端没有禁止回显功能,服务器将把字符再发送到客户端进行回显。要进入一次一个字符方式,只要激活服务器的SGA选项,方法是由客户端发送DO SGA命令,或者由服务器发送WILL SGA命令。四. 系统设计下面给出实现程序主要功能模块的设计方法。此Telnet客户端实现了一次一行的方式,其最重要的功能就是向服务器发送字符并接收服务器的回显信息。向服务器发送字符的流程图如下: 接收用户整行输入Socket是否连接到服务器否是添加换行“rn”返回向服务器发送键入的整行字符首先接收用户整行输入,判断是否连接到服务器,如果连接上,则发送整行数据。接收服务器流程图如下:接收用户输入服务器IP地址和端口号创建套接字否是否连接到服务器是显示欢迎信息是否输入超过3次?否是显示服务器信息返回输入正确否?输入用户名和密码否用户输入服务器IP地址和端口号后,建立套接字,连接到服务器,如果连接成功,则提示用户输入用户名和密码进行认证,如果认证成功,则登录服务器并显示欢迎信息,此后会不断查询是否有Telnet服务器发送的回显字符,如果有,则接收并显示出来。如果第一次登录失败,则Telnet服务器会提醒用户再次输入用户名和密码以重新登录,默认情况下,服务器会给客户端3次重试的机会。如果3次都没有通过身份验证,那么Telnet服务器会断开与客户端的连接。五. 系统实现(主要函数源代码)程序主函数,包括套接字建立,连接服务器,接收服务器回显信息,向服务器发送信息:private void doSocket() /获得服务器的地址,IP/网址 Console.WriteLine(Server Address:); /解析输入,如果是一个网址,则解析成IP IPAddress import = GetIP(Console.ReadLine(); /获得端口号 Console.WriteLine(Server Port:); 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); s.Blocking = false; s.BeginConnect( address, delegate(IAsyncResult ar) try /获得传入的对象 (此处对象是BeginConnect 的第三个参数) Socket sock1 = (Socket)ar.AsyncState; if (sock1.Connected) AsyncCallback recieveData = new AsyncCallback(OnRecievedData); 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); 接收服务器回显信息:private void OnRecievedData(IAsyncResult ar) /从参数中获得 socket 对象 Socket sock = (Socket)ar.AsyncState; int nBytesRec = sock.EndReceive(ar); /如果接收到数据 if (nBytesRec 0) /将接收到的数据转码 string sRecieved = Encoding.GetEncoding(utf-8).GetString(m_byBuff, 0, nBytesRec); /声明一个字符串,用来存储解析过的字符串 string m_strLine = ; /遍历Socket接收到的字符 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) /则返回rn 即回车换行 m_strLine = Convert.ToString(rn); /建立一个流,把接收的信息(转换后的)存进 mToProcess 中 Byte mToProcess = new BytestrLinelen; for (int i = 0; i strLinelen; i+) mToProcessi = Convert.ToByte(m_strLinei); / Process the incoming data /对接收的信息进行处理,包括对传输过来的信息的参数的存取和 string mOutText = ProcessOptions(mToProcess); /解析命令后返回 显示信息(即除掉了控制信息) if (mOutText != ) Console.Write(mOutText); / Respond to any incoming commands /接收完数据,处理完字符串数据等一系列事物之后,开始回发数据 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(); 发送数据函数(回发):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); 解析接收的数据,生成最终用户看到的有效文字,同时将附带的参数存储起来: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; /如果搜寻到IAC标记的telnet 指令,则执行以下步骤 if (ndx != -1) #region 如果存在IAC标志位 / 将 标志位IAC 的字符 赋值给最终显示文字 m_DISPLAYTEXT += m_strTemp.Substring(0, ndx); / 此处获得命令码 ch = m_strTempndx + 1; /如果命令码是253(DO) 254(DONT) 521(WILL) 252(WONT) 的情况下 if (ch = DO | ch = DONT | ch = WILL | ch = WONT) /将以IAC 开头3个字符组成的整个命令存储起来 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_strTemp存储的字段 m_DISPLAYTEXT = m_DISPLAYTEXT + m_strTemp; bScanDone = true; /输出人看到的信息 m_strNormalText = m_DISPLAYTEXT; catch (Exception eP) throw new Exception(解析传入的字符串错误: + eP.Message); return m_strNormalText; 将信息转化成charp 流的形式,使用socket 进行发出: void DispatchMessage(string strText) try /申请一个与字符串相当长度的char流 Byte smk = new BytestrText.Length; for (int i = 0; i strText.Length; i+) /解析字符串,将其存储到char流中去 Byte ss = Convert.ToByte(strTexti); smki = ss; /发送char流,之后发送完毕后执行委托中的方法(此处为匿名委托) IAsyncResult ar2 = s.BeginSend(smk, 0, smk.Length, SocketFlags.None, delegate(IAsyncResult ar) /当执行完发送数据 这个动作后 / 获取Socket对象,对象从beginsend 中的最后个参数上获得 Socket sock1 = (Socket)ar.AsyncState; if (sock1.Connected)/如果连接还是有效 /这里建立一个委托 AsyncCallback recieveData = new AsyncCallback(OnRecievedData); sock1.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock1); , s); s.EndSend(ar2); catch (Exception ers) Console.WriteLine(出错了,在回发数据的时候: + ers.Message); #endregion 解析传过来的参数,生成回发的数据到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; / 设置回发消息,首先为标志位255 m_strResp += IAC; /如果选项码为 回显(1) 或者是抑制继续进行(3) =true if (bDefined = true) #region 继续判断 /如果命令码为253 (DO) if (Verb = DO) /我设置我应答的命令码为 251(WILL) 即为支持 回显或抑制继续进行 ch = WILL; m_strResp += ch; m_strResp += Option; /如果命令码为 254(DONT) if (Verb = DONT) /我设置我应答的命令码为 252(WONT) 即为我也会拒绝启动 回显或抑制继
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年自考专业(计算机信息管理)检测卷及完整答案详解【各地真题】
- 2025年山东菏泽巨野县事业单位招聘初级综合类岗位30人笔试备考题库及参考答案详解
- 2025质量员全真模拟模拟题附答案详解(黄金题型)
- 2025康复医学治疗技术副高级职称综合提升测试卷含答案详解【完整版】
- 2024-2025学年度一级建造师考前冲刺试卷(研优卷)附答案详解
- 2024-2025学年度医学检验(师)模拟试题附答案详解(达标题)
- 2025年杭州临空经济示范区管委会招聘事业编制专业人才笔试备考题库及完整答案详解1套
- 2025版飞机购买销售合同包含飞行员培训、考核及转场服务
- 2025采购合同正规
- 2025企业双方银信贷合同协议
- 2025四川能投合江电力有限公司员工招聘11人笔试参考题库附答案解析
- 档案归档办法课件
- 2025年医院保洁员知识考试题(附答案)
- 中国汽车零配件出口分析及各国进口政策影响白皮书 2025
- T-CCCI 001-2024 企业文化建设与管理评价标准
- 测漏培训课件
- 2025年军事理论知识竞赛题库及答案
- 妇产科健康宣教
- 2025方便速食行业线上消费趋势洞察
- 两委干部日常管理制度
- 儿童编发课件图片
评论
0/150
提交评论