計算機網絡課程設計 編程實現TELNET協議的基本功能_第1頁
計算機網絡課程設計 編程實現TELNET協議的基本功能_第2頁
計算機網絡課程設計 編程實現TELNET協議的基本功能_第3頁
計算機網絡課程設計 編程實現TELNET協議的基本功能_第4頁
計算機網絡課程設計 編程實現TELNET協議的基本功能_第5頁
已閱讀5頁,還剩16頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 計算機與通信工程學院 計算機網絡課程設計 編程實現TELNET協議的基本功能專業名稱計算機科學與技術班級學號4100507學生姓名陳小軍指導教師 管瑩設計時間2013.6.242013.7.4 課程設計任務書專業:計算機科學與技術 學號: 4100507 學生姓名:陳小軍小組題目:編程實現TELNET協議的基本功能1、 TELNET協議允許用戶用一臺終端來訪問遠程的主機 ,它允許終端于主機之間以半雙工的方式交換信息,可參閱RFC8646-13。本次設計要求利用VB實現TELNET協議的基本功能 2、任務分工: (1)、遠程主機設置(ubuntu);(羅琪)(2)、設計原理分析,程序編寫,報告

2、書寫;(王志成)(3)、程序編寫、調試及截圖;(趙曉鵬)(4)、程序編寫、調試及截圖。(陳小軍)設計時間與安排1、設計時間: 2周2、設計時間安排:2013.7.7 熟悉實驗設備、收集資料: 3 天設計圖紙、實驗、計算、程序編寫調試: 8 天編寫課程設計報告: 2 天答辯: 1 天(一)設計題目:TELNET(遠程登錄)協議(二)設計要求:TELNET協議允許用戶用一臺終端來訪問遠程的主機 ,它允許終端于主機之間以半雙工的方式交換信息,可參閱RFC8646-13。本次設計要求利用VB實現TELNET協議的基本功能 (三)協議介紹:3.1 簡介Telnet協議是TCP/IP協議族中的一員,是In

3、ternet遠程登陸服務的標準協議和主要方式。它為用戶提供了在本地計算機上完成遠程主機工作的能力。在終端使用者的電腦上使用telnet程序,用它連接到服務器。終端使用者可以在telnet程序中輸入命令,這些命令會在服務器上運行,就像直接在服務器的控制臺上輸入一樣。可以在本地就能控制服務器。要開始一個telnet會話,必須輸入用戶名和密碼來登錄服務器。Telnet是常用的遠程控制Web服務器的方法。3.2 登錄先來看看什么叫登錄:分時系統允許多個用戶同時使用一臺計算機,為了保證系統的安全和記賬方便,系統要求每個用戶有單獨的帳號作為登錄標識,系統還為每個用戶指定了一個口令。用戶在使用該系統之前要輸

4、入標識和口令,這個過程被稱為'登錄'。遠程登錄是指用戶使用Telnet命令,使自己的計算機暫時成為遠程主機的一個仿真終端的過程。仿真終端等效于一個非智能的機器,它只負責把用戶輸入的每個字符傳遞給主機,再將主機輸出的每個信息回顯在屏幕上。3.3 工作過程使用Telnet協議進行遠程登錄時需要滿足以下條件:在本地計算機上必須裝有包含Telnet協議的客戶程序;必須知道遠程主機的Ip地址或域名;必須知道登錄標識與口令。Telnet遠程登錄服務分為以下4個過程:1)本地與遠程主機建立連接。該過程實際上是建立一個TCP連接,用戶必須知道遠程主機的Ip地址或域名;2)將本地終端上輸入的用戶

5、名和口令及以后輸入的任何命令或字符以NVT(Net Virtual Terminal)格式傳送到遠程主機。該過程實際上是從本地主機向遠程主機發送一個IP數據包;3)將遠程主機輸出的NVT格式的數據轉化為本地所接受的格式送回本地終端,包括輸入命令回顯和命令執行結果;4)最后,本地終端對遠程主機進行撤消連接。該過程是撤銷一個TCP連接。3.4 基本概念telnet協議建立在三個主要的思想之上:(1) 虛擬終端(2) 選項協商方法(3) 通信雙方地位對等3.4.1 NVT (網絡虛擬終端) Telnet使用網絡虛擬終端字符集來處理異構系統的遠程登錄問題。網絡虛擬終端字符集是一個通用借口,通過該借口,

6、Telent客戶端將來自本地終端的字符(數據或命令)轉換成NVT形式,然后交付網絡。而Telnet服務器講來自NVT形式的字符(數據或命令)轉換成計算機可接受的形式。3.4.2 選項協商雙方在進行Telnet連接時,要進行選項協商.比如:使用字符方式 窗口的大小,終端的類型都要進行協商.而協商是通過TELNET所支持的命令來實現的.TELNET的常用命令(具體的見TCP/IP詳解P303):SE    240(F0)     子選項結束SB    250(FA)   

7、;  子選項開始IAC   255(FF)     選項協商的第一個字節WILL  251(FB)     發送方激活選項(接收方同意激活選項)DO    253(FD)     接收方同意(發送方想讓接收方激活選項)WONT  252(FC)     接收方不同意DONT  254(FE)     接受方回

8、應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)  

9、 環境變量協商流程圖3.4.3 對稱性由于進行選項協商的兩端是完全對稱的,任意一端都有可能將對方的確認命令當成是請求命令而再次發出響應命令,這樣就會造成協商過程的無限循環(loop)。因此為了避免循環的發生,協商過程應遵循下面三個規則:(1) 只為選項的變化發出請求:(2) 接收到的請求如果要求進入已經具有的狀態,那么此請求將不被響應:(3) 當一端向另一端發送一個協商命令時,(不管這個命令是請求還是響應命令),如果該選項的使用將影響到對方接受數據的處理,那么這個命令應該被插入到該選項開始起作用的數據流的首部。3.5 Telnet命令格式:telnet 選項 主機名(IP地址)選項包括:-8&

10、#160; 采用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 設置工作參數(鍵入

11、set?可顯示詳細參數)status 顯示狀態信息toggle 改變工作參數(鍵入toggle?可顯示詳細參數)換碼符(escape character), 在異常情況下退出會話,回到命令方式quit退出telnet,返回本地機z使telnet進入暫停狀態<cr>;結束命令方式,返回telnet的會話方式(四)實現telnet協議 using System;using ;using System.Linq;using System.Text;using ;using System.Net;using ;using System.Collections;namespace telne

12、t class Program #region 定義一些變量 / <summary> / 定義一些標識符。 / </summary> readonly Char IAC = Convert.ToChar(255);/標識符,代表是一個TELNET指令 readonly Char DO = Convert.ToChar(253);/表示一方要求另一方使用,或者確認你希望另一方使用指定的選項。 readonly Char DONT = Convert.ToChar(254);/ 表示一方要求另一方停止使用,或者確認你不再希望另一方使用指定的選項。 readonly Char

13、 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 = &#

14、39;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

15、 Main(string args) Console.Title = "telnet-4100507-chenxiaojun" / Console.BackgroundColor = ConsoleColor.Green; Console.ForegroundColor = ConsoleColor.Red; /實例化這個對象 Program p = new Program(); /啟動socket進行telnet連接 p.doSocket(); / <summary> / 啟動scocket,進行telnet操作 / </summary> priv

16、ate 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,SocketTyp

17、e.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 r

18、ecieveData = 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 (); /因

19、為回車都沒有發送,在此處不上 DispatchMessage("rn"); / right / <summary> / 當接收完成后,執行的方法 / </summary> / <param name="ar"></param> private void OnRecieveData(IAsyncResult ar) /從參數中獲得給的sockrt對象 Socket sock =(Socket)ar.AsyncState; int nBytesRec =sock.EndReceive(ar); /如果有數據 i

20、f (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_st

21、rLine += 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

22、(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("接收數據的時候出錯了!&

23、quot; + ex.Message); else/ 如果沒有接收到任何數據的話 / 輸出 關閉連接 Console.WriteLine("Disconnected", sock.RemoteEndPoint); / 關閉socket sock.Shutdown(SocketShutdown.Both); sock.Close(); Console.Write("Game Over"); Console.ReadLine(); /right / <summary> / 發送數據的函數 / </summary> private vo

24、id 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) Cons

25、ole.WriteLine("錯錯了,在回發數據的時候 " + ers.Message); /right /解析接收的數據,生成最終用戶看到的有效文字,同時將附帶的參數存儲起來 private string ProcessOptions(byte m_strLineToProcess) string m_DISPLAYTEXT = "" string m_strTemp = "" string m_strOption = "" string m_strNormalText = "" bool b

26、ScanDone = false; int ndx = 0; int ldx = 0; char ch; try /把數據從byte 轉化成string for (int i = 0; i < m_strLineToProcess.Length; i+) Char ss = Convert.ToChar(m_strLineToProcessi); m_strTemp = m_strTemp + Convert.ToString(ss); /此處意義為,當沒描完數據前,執行掃描 while (bScanDone != true) int lensmk = m_strTemp.Length;

27、 ndx = m_strTemp.IndexOf(Convert.ToString(IAC); if (ndx > 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.Substri

28、ng(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); /之后將處理過的字符串排除

29、出去 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 /

30、若字符串里已經沒有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 ArrangeR

31、eply(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 i

32、f (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_s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論