版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 計算機與通信工程學(xué)院</p><p> 《計算機網(wǎng)絡(luò)》課程設(shè)計</p><p> 編程實現(xiàn)TELNET協(xié)議的基本功能</p><p> 專業(yè)名稱計算機科學(xué)與技術(shù)</p><p> 班級學(xué)號</p><p> 學(xué)生姓名</p><p> 指導(dǎo)教師</p>&
2、lt;p> 設(shè)計時間2013.6.24~2013.7.4</p><p><b> 課程設(shè)計任務(wù)書</b></p><p> 專業(yè):計算機科學(xué)與技術(shù) 學(xué)號: 4100507 學(xué)生姓名:陳小軍</p><p> 小組題目:編程實現(xiàn)TELNET協(xié)議的基本功能</p><p> 1、 TELNET協(xié)議允許用戶
3、用一臺終端來訪問遠程的主機 ,它允許終端于主機之間以半雙工的方式交換信息,可參閱RFC864[6-13]。本次設(shè)計要求利用VB實現(xiàn)TELNET協(xié)議的基本功能 </p><p><b> 2、任務(wù)分工: </b></p><p> ?。?)、遠程主機設(shè)置(ubuntu);(羅琪)</p><p> ?。?)、設(shè)計原理分析,程序編寫,報告書寫;(
4、王志成)</p><p> (3)、程序編寫、調(diào)試及截圖;(趙曉鵬)</p><p> ?。?)、程序編寫、調(diào)試及截圖。(陳小軍)</p><p><b> 設(shè)計時間與安排</b></p><p> 1、設(shè)計時間: 2周</p><p> 2、設(shè)計時間安排: 2013.6.24~2013.
5、7.7 </p><p> 熟悉實驗設(shè)備、收集資料: 3 天</p><p> 設(shè)計圖紙、實驗、計算、程序編寫調(diào)試: 8 天</p><p> 編寫課程設(shè)計報告: 2 天</p><p><b> 答辯: 1 天</b></p><p> ?。ㄒ唬┰O(shè)計題目:TELNET(遠程登錄)
6、協(xié)議</p><p><b> ?。ǘ┰O(shè)計要求:</b></p><p> TELNET協(xié)議允許用戶用一臺終端來訪問遠程的主機 ,它允許終端于主機之間以半雙工的方式交換信息,可參閱RFC864[6-13]。本次設(shè)計要求利用VB實現(xiàn)TELNET協(xié)議的基本功能 </p><p><b> ?。ㄈ﹨f(xié)議介紹:</b><
7、/p><p><b> 3.1 簡介</b></p><p> Telnet協(xié)議是TCP/IP協(xié)議族中的一員,是Internet遠程登陸服務(wù)的標準協(xié)議和主要方式。它為用戶提供了在本地計算機上完成遠程主機工作的能力。在終端使用者的電腦上使用telnet程序,用它連接到服務(wù)器。終端使用者可以在telnet程序中輸入命令,這些命令會在服務(wù)器上運行,就像直接在服務(wù)器的控制
8、臺上輸入一樣??梢栽诒镜鼐湍芸刂品?wù)器。要開始一個telnet會話,必須輸入用戶名和密碼來登錄服務(wù)器。Telnet是常用的遠程控制Web服務(wù)器的方法。</p><p><b> 3.2 登錄</b></p><p> 先來看看什么叫登錄:分時系統(tǒng)允許多個用戶同時使用一臺計算機,為了保證系統(tǒng)的安全和記賬方便,系統(tǒng)要求每個用戶有單獨的帳號作為登錄標識,系統(tǒng)還為每個
9、用戶指定了一個口令。用戶在使用該系統(tǒng)之前要輸入標識和口令,這個過程被稱為'登錄'?!∵h程登錄是指用戶使用Telnet命令,使自己的計算機暫時成為遠程主機的一個仿真終端的過程。仿真終端等效于一個非智能的機器,它只負責(zé)把用戶輸入的每個字符傳遞給主機,再將主機輸出的每個信息回顯在屏幕上。</p><p> 3.3 工作過程</p><p> 使用Telnet協(xié)議進行遠程登
10、錄時需要滿足以下條件:在本地計算機上必須裝有包含Telnet協(xié)議的客戶程序;必須知道遠程主機的Ip地址或域名;必須知道登錄標識與口令。 </p><p> Telnet遠程登錄服務(wù)分為以下4個過程: </p><p> 1)本地與遠程主機建立連接。該過程實際上是建立一個TCP連接,用戶必須知道遠程主機的Ip地址或域名;</p><p> 2)將本地終端上輸入的
11、用戶名和口令及以后輸入的任何命令或字符以NVT(Net Virtual Terminal)格式傳送到遠程主機。該過程實際上是從本地主機向遠程主機發(fā)送一個IP數(shù)據(jù)包; </p><p> 3)將遠程主機輸出的NVT格式的數(shù)據(jù)轉(zhuǎn)化為本地所接受的格式送回本地終端,包括輸入命令回顯和命令執(zhí)行結(jié)果; </p><p> 4)最后,本地終端對遠程主機進行撤消連接。該過程是撤銷一個TCP連接。<
12、;/p><p><b> 3.4 基本概念</b></p><p> telnet協(xié)議建立在三個主要的思想之上:</p><p><b> 虛擬終端</b></p><p><b> 選項協(xié)商方法</b></p><p><b> 通信雙
13、方地位對等</b></p><p> 3.4.1 NVT (網(wǎng)絡(luò)虛擬終端)</p><p> Telnet使用網(wǎng)絡(luò)虛擬終端字符集來處理異構(gòu)系統(tǒng)的遠程登錄問題。網(wǎng)絡(luò)虛擬終端字符集是一個通用借口,通過該借口,Telent客戶端將來自本地終端的字符(數(shù)據(jù)或命令)轉(zhuǎn)換成NVT形式,然后交付網(wǎng)絡(luò)。而Telnet服務(wù)器講來自NVT形式的字符(數(shù)據(jù)或命令)轉(zhuǎn)換成計算機可接受的形式。&l
14、t;/p><p> 3.4.2 選項協(xié)商</p><p> 雙方在進行Telnet連接時,要進行選項協(xié)商.比如:使用字符方式 窗口的大小,終端的類型都要進行協(xié)商.而協(xié)商是通過TELNET所支持的命令來實現(xiàn)的.</p><p> TELNET的常用命令(具體的見TCP/IP詳解P303):SE 240(F0)
15、 子選項結(jié)束SB 250(FA) 子選項開始IAC 255(FF) 選項協(xié)商的第一個字節(jié)WILL 251(FB) 發(fā)送方激活選項(接收方同意激活選項)DO &
16、#160; 253(FD) 接收方同意(發(fā)送方想讓接收方激活選項)WONT 252(FC) 接收方不同意DONT 254(FE) 接受方回應(yīng)WONT</p><p> 例如: “WILL X”表示“你是否同意我使用X 選項”</p>
17、;<p> “DO X ”表示“我同意你使用X 選項”</p><p> TELNET的常用選項代碼1(0x01) 回顯(echo)3(0x03) 抑制繼續(xù)進行(傳送一次一個字符方式可以選擇這個選項)24(0x18) 終端類型31(0x1F) 窗口大小32(0x20)
18、 終端速率33(0x21) 遠程流量控制34(0x22) 行方式36(0x24) 環(huán)境變量</p><p><b> 協(xié)商流程圖</b></p><p><b> 3.4.3 對稱性</b></p><p> 由于進
19、行選項協(xié)商的兩端是完全對稱的,任意一端都有可能將對方的確認命令當(dāng)成是請求命令而再次發(fā)出響應(yīng)命令,這樣就會造成協(xié)商過程的無限循環(huán)(loop)。因此為了避免循環(huán)的發(fā)生,協(xié)商過程應(yīng)遵循下面三個規(guī)則:</p><p> 只為選項的變化發(fā)出請求:</p><p> 接收到的請求如果要求進入已經(jīng)具有的狀態(tài),那么此請求將不被響應(yīng):</p><p> 當(dāng)一端向另一端發(fā)送一個協(xié)
20、商命令時,(不管這個命令是請求還是響應(yīng)命令),如果該選項的使用將影響到對方接受數(shù)據(jù)的處理,那么這個命令應(yīng)該被插入到該選項開始起作用的數(shù)據(jù)流的首部。</p><p> 3.5 Telnet命令格式:</p><p> telnet [選項] 主機名(IP地址)</p><p><b> 選項包括:</b></p><
21、p> -8 采用8位二進制傳輸</p><p> -E 屏蔽所有的退出</p><p> -L 使用8位二進制輸出</p><p><b> -a 自動登錄</b></p><p> -d 開關(guān)DEBUG信息,可從/usr/adm/syslog中
22、看到(UNIX)</p><p> -e [ESCAPE_CHAR] 設(shè)置退出字符</p><p> -l USER 自動登錄時作為用戶名</p><p><b> 常用命令</b></p><p><b> help 聯(lián)機求助</b><
23、/p><p> open后接IP地址或域名 即可進行遠程登錄</p><p> close 正常結(jié)束遠程會話,回到命令方式</p><p> display 顯示工作參數(shù)</p><p> mode 進入行命令或字符方式</p><p> send 向遠程主機傳送特殊字符(鍵入send?可顯示詳細字符)</
24、p><p> set 設(shè)置工作參數(shù)(鍵入set?可顯示詳細參數(shù))</p><p> status 顯示狀態(tài)信息</p><p> toggle 改變工作參數(shù)(鍵入toggle?可顯示詳細參數(shù))</p><p> ^]換碼符(escape character), 在異常情況下退出會話,回到命令方式</p><p>
25、 quit退出telnet,返回本地機</p><p> z使telnet進入暫停狀態(tài)</p><p> <cr>;結(jié)束命令方式,返回telnet的會話方式</p><p> ?。ㄋ模崿F(xiàn)telnet協(xié)議</p><p> using System;</p><p> using System.Co
26、llections.Generic;</p><p> using System.Linq;</p><p> using System.Text;</p><p> using System.Threading.Tasks;</p><p> using System.Net;</p><p> using
27、 System.Net.Sockets;</p><p> using System.Collections;</p><p> namespace telnet</p><p><b> {</b></p><p> class Program</p><p><b> {&
28、lt;/b></p><p> #region 定義一些變量</p><p> /// <summary></p><p> /// 定義一些標識符。</p><p> /// </summary></p><p> readonly Char IAC = Convert.ToC
29、har(255);//標識符,代表是一個TELNET指令</p><p> readonly Char DO = Convert.ToChar(253);//表示一方要求另一方使用,或者確認你希望另一方使用指定的選項。</p><p> readonly Char DONT = Convert.ToChar(254);// 表示一方要求另一方停止使用,或者確認你不再希望另一方使用指定的
30、選項。</p><p> readonly Char WILL = Convert.ToChar(251);// 表示希望開始使用或者確認所使用的是指定的選項。。</p><p> readonly Char WONT = Convert.ToChar(252);//表示拒絕使用或者繼續(xù)使用指定的選項</p><p> readonly Char SB = C
31、onvert.ToChar(250);//表示后面所跟的是對需要的選項的子談判</p><p> readonly Char SE = Convert.ToChar(240);//子談判參數(shù)的結(jié)束</p><p> const Char IS = '0';</p><p> const Char SEND = '1';</
32、p><p> const Char INFO = '2';</p><p> const Char VAR = '0';</p><p> const Char VALUE = '1';</p><p> const Char ESC = '2';</p>&l
33、t;p> const Char USERVAR = '3';</p><p> byte[] m_byBuff = new byte[100000];//流</p><p> private ArrayList m_ListOptions = new ArrayList(); //收到的控制信息</p><p> string m_st
34、rResp;//存儲準備發(fā)送的信息</p><p> private Socket s;//一個套接字</p><p> #endregion</p><p> static void Main(string[] args)</p><p><b> {</b></p><p> Con
35、sole.Title = "telnet-4100507-chenxiaojun";</p><p> // Console.BackgroundColor = ConsoleColor.Green;</p><p> Console.ForegroundColor = ConsoleColor.Red;</p><p><b>
36、 //實例化這個對象</b></p><p> Program p = new Program();</p><p> //啟動socket進行telnet連接</p><p> p.doSocket();</p><p><b> }</b></p><p> /// &
37、lt;summary></p><p> /// 啟動scocket,進行telnet操作</p><p> /// </summary></p><p> private void doSocket()</p><p><b> {</b></p><p> Cons
38、ole.WriteLine("服務(wù)器端地址:");</p><p><b> //輸入ip地址</b></p><p> IPAddress import = IPAddress.Parse(Console.ReadLine());</p><p><b> //獲得端口號</b></p&g
39、t;<p> Console.WriteLine("服務(wù)器端口號:");</p><p> int port =int.Parse(Console.ReadLine());</p><p> //建立一個socket對象,使用ipv4,使用流進行連接,使用tcp/ip協(xié)議</p><p> s =new Socket(Add
40、ressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp );</p><p> //獲得一個連接地址對象(由ip地址和端口號構(gòu)成)</p><p> IPEndPoint address =new IPEndPoint(import,port);</p><p> //說明此socket不是出于阻止
41、模式</p><p> s.Blocking=false;</p><p> s.BeginConnect(address,</p><p> delegate(IAsyncResult ar)</p><p><b> {</b></p><p><b> try</b
42、></p><p><b> {</b></p><p> //獲得傳入的對象(此處對象是beingconnect的第三個參數(shù))</p><p> Socket sock1 =(Socket)ar.AsyncState;</p><p> if(sock1.Connected)</p><
43、;p><b> {</b></p><p> AsyncCallback recieveData = new AsyncCallback(OnRecieveData);</p><p> sock1.BeginReceive(m_byBuff,0,m_byBuff.Length,SocketFlags.None,recieveData,sock1);<
44、;/p><p><b> }</b></p><p><b> }</b></p><p> catch(Exception ex)</p><p><b> {</b></p><p> Console.WriteLine("初始化接收
45、信息出錯:"+ex.Message);</p><p><b> }</b></p><p><b> },s);</b></p><p> //此處是為了發(fā)送指令不停的循環(huán) 發(fā)送要登錄的賬戶和密碼等。</p><p> while (true)</p><p&
46、gt;<b> {</b></p><p><b> //發(fā)送讀出的數(shù)據(jù)</b></p><p> DispatchMessage(Console.ReadLine ());</p><p> //因為回車都沒有發(fā)送,在此處不上</p><p> DispatchMessage("
47、;\r\n");</p><p><b> }</b></p><p> } // right</p><p> /// <summary></p><p> /// 當(dāng)接收完成后,執(zhí)行的方法</p><p> /// </summary>
48、;</p><p> /// <param name="ar"></param></p><p> private void OnRecieveData(IAsyncResult ar)</p><p><b> {</b></p><p> //從參數(shù)中獲得給的soc
49、krt對象</p><p> Socket sock =(Socket)ar.AsyncState;</p><p> int nBytesRec =sock.EndReceive(ar);</p><p><b> //如果有數(shù)據(jù)</b></p><p> if (nBytesRec > 0)</p
50、><p><b> {</b></p><p> //講接收到的數(shù)據(jù)轉(zhuǎn)碼,順便轉(zhuǎn)成string 型</p><p> string sReceive = Encoding.GetEncoding("utf-8").GetString(m_byBuff, 0, nBytesRec);</p><p>
51、 //聲明一個字符串,用來存貯解析過的字符串</p><p> string m_strLine = "";</p><p> for (int i = 0; i < nBytesRec; i++)</p><p><b> {</b></p><p> Char ch = Conve
52、rt.ToChar(m_byBuff[i]);</p><p> switch (ch)</p><p><b> {</b></p><p> case '\r':</p><p> m_strLine += Convert.ToString("\r\n");</p&g
53、t;<p><b> break;</b></p><p> case '\n':</p><p><b> break;</b></p><p><b> default:</b></p><p> m_strLine += Conve
54、rt.ToString(ch);</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> try</b></p><p><
55、b> {</b></p><p> int strLinelen = m_strLine.Length;</p><p> if (strLinelen == 0)</p><p><b> {</b></p><p> m_strLine = Convert.ToString("\
56、r\n");</p><p><b> }</b></p><p> //建立一個流,把接收的信息存進mToProcess中</p><p> Byte[] mToProcess = new Byte[strLinelen];</p><p> for (int i = 0; i < strLin
57、elen; i++)</p><p> mToProcess[i] = Convert.ToByte(m_strLine[i]);</p><p> //對接收的信息進行處理</p><p> string mOutText = ProcessOptions(mToProcess);</p><p> if (mOutText !=
58、"")</p><p> Console.Write(mOutText);</p><p> //接收完數(shù)據(jù),處理完字符串?dāng)?shù)據(jù)等一系列事物之后,開始回發(fā)數(shù)據(jù)</p><p> RespondToOptions();</p><p><b> }</b></p><p>
59、 catch (Exception ex)</p><p><b> {</b></p><p> throw new Exception("接收數(shù)據(jù)的時候出錯了!" + ex.Message);</p><p><b> }</b></p><p><b>
60、 }</b></p><p> else// 如果沒有接收到任何數(shù)據(jù)的話</p><p><b> {</b></p><p> // 輸出 關(guān)閉連接</p><p> Console.WriteLine("Disconnected", sock.RemoteEndPoint)
61、;</p><p> // 關(guān)閉socket</p><p> sock.Shutdown(SocketShutdown.Both);</p><p> sock.Close();</p><p> Console.Write("Game Over");</p><p> Console.
62、ReadLine();</p><p><b> }</b></p><p> } //right</p><p> /// <summary></p><p> /// 發(fā)送數(shù)據(jù)的函數(shù)</p><p> /// </summary></p>&
63、lt;p> private void RespondToOptions()</p><p><b> {</b></p><p><b> try</b></p><p> { //聲明一個字符串,來存儲 接收到的參數(shù) </p><p> string strO
64、ption;</p><p> for (int i = 0; i < m_ListOptions.Count; i++)</p><p><b> {</b></p><p> //獲得一個控制信息參數(shù)</p><p> strOption = (string)m_ListOptions[i];</
65、p><p> //根據(jù)這個參數(shù),進行處理</p><p> ArrangeReply(strOption);</p><p><b> }</b></p><p> DispatchMessage(m_strResp);</p><p> m_strResp = "";&
66、lt;/p><p> m_ListOptions.Clear();</p><p><b> }</b></p><p> catch (Exception ers)</p><p><b> {</b></p><p> Console.WriteLine("
67、;錯錯了,在回發(fā)數(shù)據(jù)的時候 " + ers.Message);</p><p><b> }</b></p><p><b> } //right</b></p><p> //解析接收的數(shù)據(jù),生成最終用戶看到的有效文字,同時將附帶的參數(shù)存儲起來</p><p> private
68、string ProcessOptions(byte[] m_strLineToProcess)</p><p><b> {</b></p><p> string m_DISPLAYTEXT = "";</p><p> string m_strTemp = "";</p><
69、;p> string m_strOption = "";</p><p> string m_strNormalText = "";</p><p> bool bScanDone = false;</p><p> int ndx = 0;</p><p> int ldx = 0;&
70、lt;/p><p><b> char ch;</b></p><p><b> try </b></p><p><b> {</b></p><p> //把數(shù)據(jù)從byte[] 轉(zhuǎn)化成string</p><p> for (int i
71、 = 0; i < m_strLineToProcess.Length; i++)</p><p><b> {</b></p><p> Char ss = Convert.ToChar(m_strLineToProcess[i]);</p><p> m_strTemp = m_strTemp + Convert.ToStrin
72、g(ss);</p><p><b> }</b></p><p> //此處意義為,當(dāng)沒描完數(shù)據(jù)前,執(zhí)行掃描</p><p> while (bScanDone != true)</p><p><b> {</b></p><p> int lensmk = m
73、_strTemp.Length;</p><p> ndx = m_strTemp.IndexOf(Convert.ToString(IAC));</p><p> if (ndx > lensmk) </p><p> ndx = m_strTemp.Length; </p><p> if (ndx !=
74、 -1)</p><p><b> {</b></p><p><b> #region </b></p><p> // 將 標志位IAC 的字符 賦值給最終顯示文字 </p><p> m_DISPLAYTEXT += m_strTemp.Substring(0, ndx);</p
75、><p> // 此處獲得命令碼</p><p> ch = m_strTemp[ndx + 1];</p><p> if (ch == DO || ch == DONT || ch == WILL || ch == WONT)</p><p><b> {</b></p><p> m_
76、strOption = m_strTemp.Substring(ndx, 3); </p><p> m_ListOptions.Add(m_strOption);</p><p> // 將 標志位IAC 的字符 賦值給最終顯示文字 </p><p> m_DISPLAYTEXT += m_strTemp.Substring(0, ndx);</p&g
77、t;<p> string txt = m_strTemp.Substring(ndx + 3);</p><p> m_strTemp = txt;</p><p><b> }</b></p><p> //如果IAC后面又跟了個IAC (255)</p><p> else if (ch =
78、= IAC)</p><p><b> {</b></p><p> //則顯示從輸入的字符串頭開始,到之前的IAC 結(jié)束 </p><p> m_DISPLAYTEXT = m_strTemp.Substring(0, ndx);</p><p> //之后將處理過的字符串排除出去</p><
79、;p> m_strTemp = m_strTemp.Substring(ndx + 1);</p><p><b> }</b></p><p> //如果IAC后面跟的是SB(250) </p><p> else if (ch == SB)</p><p><b> {</b>&
80、lt;/p><p> m_DISPLAYTEXT = m_strTemp.Substring(0, ndx);</p><p> ldx = m_strTemp.IndexOf(Convert.ToString(SE));</p><p> m_strOption = m_strTemp.Substring(ndx, ldx);</p><p&
81、gt; m_ListOptions.Add(m_strOption);</p><p> m_strTemp = m_strTemp.Substring(ldx);</p><p><b> }</b></p><p> #endregion</p><p><b> }</b></
82、p><p> //若字符串里已經(jīng)沒有IAC標志位了</p><p><b> else</b></p><p><b> {</b></p><p> m_DISPLAYTEXT = m_DISPLAYTEXT + m_strTemp;</p><p> bScanDo
83、ne = true;</p><p><b> }</b></p><p><b> }</b></p><p> m_strNormalText = m_DISPLAYTEXT;</p><p><b> }</b></p><p> cat
84、ch (Exception eP)</p><p><b> {</b></p><p> throw new Exception("解析傳入的字符串錯誤:" + eP.Message);</p><p><b> }</b></p><p> return m_strN
85、ormalText;</p><p><b> }// right</b></p><p> #region magic Function</p><p> //解析傳過來的參數(shù),生成回發(fā)的數(shù)據(jù)到m_strResp</p><p> private void ArrangeReply(string strOpti
86、on)</p><p><b> {</b></p><p><b> try</b></p><p><b> {</b></p><p> Char Verb; </p><p> Char Option;</p><p
87、> Char Modifier; </p><p> Char ch; </p><p> bool bDefined = false;</p><p> if (strOption.Length < 3) return;</p><p> Verb = strOption[1];</p><
88、;p> Option = strOption[2];</p><p> //如果選項碼為 回顯(1) 或者是抑制繼續(xù)進行(3)</p><p> if (Option == 1 || Option == 3)</p><p><b> {</b></p><p> bDefined = true;<
89、/p><p><b> }</b></p><p> m_strResp += IAC;</p><p> //如果選項碼為 回顯(1) 或者是抑制繼續(xù)進行(3) ==true</p><p> if (bDefined == true)</p><p><b> {</b&
90、gt;</p><p> #region 繼續(xù)判斷</p><p> if (Verb == DO)</p><p><b> {</b></p><p> ch = WILL; </p><p> m_strResp += ch; </p><p> m_st
91、rResp += Option; </p><p><b> }</b></p><p> if (Verb == DONT)</p><p><b> {</b></p><p> ch = WONT; </p><p> m_strResp += ch;
92、</p><p> m_strResp += Option; </p><p><b> }</b></p><p> if (Verb == WILL)</p><p><b> {</b></p><p><b> ch = DO;</b>
93、</p><p> m_strResp += ch; </p><p> m_strResp += Option;</p><p><b> }</b></p><p> if (Verb == WONT)</p><p><b> {</b></p>
94、<p> ch = DONT; </p><p> m_strResp += ch; </p><p> m_strResp += Option;</p><p><b> }</b></p><p> if (Verb == SB)</p><p><b&g
95、t; {</b></p><p> Modifier = strOption[3];</p><p> if (Modifier == SEND)</p><p><b> {</b></p><p><b> ch = SB;</b></p><p>
96、 m_strResp += ch;</p><p> m_strResp += Option;</p><p> m_strResp += IS;</p><p> m_strResp += IAC;</p><p> m_strResp += SE;</p><p><b> }</b&g
97、t;</p><p><b> }</b></p><p> #endregion</p><p><b> }</b></p><p><b> else </b></p><p><b> {</b></p>
98、;<p> #region 底下一系列代表,無論你發(fā)那種請求,我都不干</p><p> if (Verb == DO)</p><p><b> {</b></p><p> ch = WONT;</p><p> m_strResp += ch;</p><p> m
99、_strResp += Option;</p><p><b> }</b></p><p> if (Verb == DONT)</p><p><b> {</b></p><p> ch = WONT;</p><p> m_strResp += ch;
100、</p><p> m_strResp += Option;</p><p><b> }</b></p><p> if (Verb == WILL)</p><p><b> {</b></p><p> ch = DONT; </p><p
101、> m_strResp += ch; </p><p> m_strResp += Option;</p><p><b> }</b></p><p> if (Verb == WONT)</p><p><b> {</b></p><p> ch
102、= DONT;</p><p> m_strResp += ch; </p><p> m_strResp += Option;</p><p><b> }</b></p><p> #endregion</p><p><b> }</b></p>
103、;<p><b> }</b></p><p> catch (Exception eeeee)</p><p><b> {</b></p><p> throw new Exception("解析參數(shù)時出錯:" + eeeee.Message);</p><
104、p><b> }</b></p><p> } // 括號無措</p><p> void DispatchMessage(string strText)</p><p><b> {</b></p><p><b> try</b></
105、p><p><b> {</b></p><p> //申請一個與字符串相當(dāng)長度的char流 </p><p> Byte[] smk = new Byte[strText.Length];</p><p> for (int i = 0; i < strText.Length; i++)</p>
106、<p><b> {</b></p><p> //解析字符串,將其存儲到char流中去</p><p> Byte ss = Convert.ToByte(strText[i]);</p><p> smk[i] = ss;</p><p><b> }</b></p&
107、gt;<p> IAsyncResult ar2 = s.BeginSend(smk, 0, smk.Length, SocketFlags.None, delegate(IAsyncResult ar)</p><p><b> {</b></p><p> Socket sock1 = (Socket)ar.AsyncState;</p&
108、gt;<p> if (sock1.Connected)</p><p><b> {</b></p><p> AsyncCallback recieveData = new AsyncCallback(OnRecieveData);</p><p> sock1.BeginReceive(m_byBuff, 0, m_
109、byBuff.Length, SocketFlags.None, recieveData, sock1);</p><p><b> }</b></p><p><b> },s );</b></p><p> s.EndSend(ar2);</p><p><b> }</
110、b></p><p> catch(Exception ers)</p><p><b> {</b></p><p> Console.WriteLine("出錯了,在回發(fā)數(shù)據(jù)的時候:" + ers.Message);</p><p><b> }</b><
111、/p><p><b> }</b></p><p> #endregion</p><p><b> }</b></p><p><b> }</b></p><p><b> ?。ㄎ澹?實驗截圖</b></p>
112、<p> 5.1 先知道遠程主機的IP地址:</p><p> 5.2windows下 telnet命令登錄遠程主機:</p><p><b> 5.3 登錄成功</b></p><p> 5.4 執(zhí)行一些操作</p><p> 5.5 遠程主機相應(yīng)的變化</p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計算機網(wǎng)絡(luò)課程設(shè)計--編程實現(xiàn)基于udp的ping
- 計算機網(wǎng)絡(luò)課程設(shè)計-編程實現(xiàn)簡單的tcp協(xié)議分析器
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 《計算機網(wǎng)絡(luò)課程設(shè)計》
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)編程課程設(shè)計-- 24分游戲
- 計算機網(wǎng)絡(luò)編程課程設(shè)計-- 猜數(shù)游戲
- 計算機網(wǎng)絡(luò)編程24分游戲課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計---nat功能的配置與實現(xiàn)
- 計算機網(wǎng)絡(luò)課程設(shè)計--基于tcp協(xié)議編程的網(wǎng)絡(luò)聊天室
- 計算機網(wǎng)絡(luò)課程設(shè)計---nat功能的配置與實現(xiàn)
- 計算機網(wǎng)絡(luò)課程設(shè)計---網(wǎng)絡(luò)設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告--- csmacd協(xié)議仿真
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
評論
0/150
提交評論