

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、<p><b> 課程設計報告</b></p><p> 設計名稱: 網(wǎng)絡協(xié)議編程應用課程設計 </p><p> 系 (院): 機算計科學學院 </p><p> 專業(yè)班級: 網(wǎng)絡11003班 </p><p&
2、gt; 姓 名: </p><p> 學 號: </p><p> 指導教師: </p><p> 設計時間: 2013.6.7 - 2013.6.18 </p><p> 設
3、計地點: 四號樓1樓2號機房 </p><p><b> 一、目的與任務</b></p><p> 網(wǎng)絡協(xié)議編程應用課程設計是《TCP/IP協(xié)議分析》課程后的一個重要的教學環(huán)節(jié),是對學生進行的一次較為全面的網(wǎng)絡協(xié)議編程方面的訓練。其基本目的是:</p><p> (1)培養(yǎng)學生理論聯(lián)系實際的設計思想,訓練綜合運
4、用所學的基礎理論知識,結(jié)合生產(chǎn)實際分析和解決網(wǎng)絡應用中問題的能力,從而使基礎理論知識得到鞏固和加深。</p><p> ?。?)通過編程實踐學習掌握網(wǎng)絡協(xié)議的運行原理。</p><p> (3)練習多線程的網(wǎng)絡編程模式,為以后開發(fā)真實的應用協(xié)議打下基礎。</p><p><b> 二、基本要求</b></p><p>
5、; ?。?)合理設計系統(tǒng)框圖和程序結(jié)構(gòu)圖。</p><p> ?。?)根據(jù)系統(tǒng)框圖設計,編寫程序代碼。</p><p> ?。?)編寫程序說明書。</p><p><b> 三、實驗環(huán)境</b></p><p> 安裝有vs2010以及虛擬機的計算機</p><p><b> 四、
6、課程設計內(nèi)容</b></p><p> ?。?)、熟悉開發(fā)工具</p><p> Visual Studio是微軟公司推出的開發(fā)環(huán)境。是目前最流行的Windows平臺應用程序開發(fā)環(huán)境。Visual Studio 2010版本于2010年4月12日上市,其集成開發(fā)環(huán)境(IDE)的界面被重新設計和組織,變得更加簡單明了。Visual Studio 2010同時帶來了 NET F
7、ramework 4.0、Microsoft Visual Studio 2010 CTP( Community Technology Preview--CTP),并且支持開發(fā)面向Windows 7的應用程序。除了Microsoft SQL Server,它還支持 IBM DB2和Oracle數(shù)據(jù)庫。學習使用好vs2010對于我們來說有很大意義。</p><p> ?。?)、套接字編程練習</p>
8、<p> 使用TCP/IP協(xié)議的應用程序通常采用兩種應用編程接口(API):socket和TLI(運輸層接)。前者有時稱作"Berkeley socket",表明它是從伯克利版發(fā)展而來的。后者起初是由AT & T開發(fā)的,有時稱作XTI(X/Open運輸層接口),以承認X/Open這個自己定義標準的國際計算機生產(chǎn)商所做的工作。XTI實際上是TLI的一個超集。而在windows操作系統(tǒng)中,實現(xiàn)了win
9、dows版本的socketAPI,又稱winsock。</p><p> TCP/IP還是OSI的ISO協(xié)議都是分層模式的,用層的概念屏蔽的下層的細節(jié),只要完成自層的功能即可,因而程序員在做網(wǎng)絡編程時并不需要去關心網(wǎng)絡底層的具體實現(xiàn),只需要關心軟件的功能即可極大的簡化了程序的編寫。因而我們在學習網(wǎng)絡socket編程時并不一定要很多的網(wǎng)絡方面的知識,甚至是TCP/IP協(xié)議的知識也不需要太多。因而在著我就不介紹那方
10、面的知識了,如果要了解網(wǎng)上也四處都有那些被別人應用了N遍的經(jīng)典的介紹。 在這只介紹基于TCP和UDP的簡單的編程實現(xiàn)。</p><p> 現(xiàn)今的網(wǎng)絡程序一般都是基于C/S模型,即客戶機-服務器模型。這種結(jié)構(gòu)將主要運算操作放在中心計算機上。同集中式大型計算系統(tǒng)比較,"客戶-服務器"結(jié)構(gòu)的主要優(yōu)點 是提供了良好的實用性、靈活性、交互性和可擴展性。"客戶-服務器"以數(shù)據(jù)庫服務器
11、取代集中式文件共享進而實現(xiàn)了計算機系統(tǒng)之間的松耦合。</p><p> Windows Sockets是Microsoft Windows的網(wǎng)絡程序設計接口,它是從Berkeley Sockets擴展而來的,以動態(tài)鏈接庫的形式提供給我們使用。Windows Sockets在繼承了Berkeley Sockets主要特征的基礎上,又對它進行了重要擴充。這些擴充主要是提供了一些異步函數(shù),并增加了符合Windows消
12、息驅(qū)動特性的網(wǎng)絡事件異步選擇機制。Windows Sockets 1.1和Berkeley Sockets都是基于TCP/IP協(xié)議的;Windows Sockets 2從Windows Sockets 1.1發(fā)展而來,與協(xié)議無關并向下兼容,可以使用任何底 層傳輸協(xié)議提供的通信能力,來為上層應用程序完成網(wǎng)絡數(shù)據(jù)通訊,而不關心底層網(wǎng)絡鏈路的通訊情況,真正實現(xiàn)了底層網(wǎng)絡通訊對應用程序的透明。</p><p> 套接字
13、的類型總共有三類:</p><p> 1) 流式套接字(SOCK_STREAM)</p><p> 提供面向連接、可靠的數(shù)據(jù)傳輸服務,數(shù)據(jù)無差錯、無重復的發(fā)送,且按發(fā)送順序接收。這種類型是基于TCP協(xié)議的。</p><p> 2) 數(shù)據(jù)報式套接字(SOCK_DGRAM)</p><p> 提供無連接服務。數(shù)據(jù)包以獨立包形式發(fā)送,不
14、提供無錯保證,數(shù)據(jù)可能丟失或重復,并且接收順序混亂。 這種類型是基于UDP協(xié)議的</p><p> 3) 原始套接字(SOCK_RAW)。</p><p> 用于編寫基于IP協(xié)議的程序。 它可以訪問ICMP和ICMP等協(xié)議包,可以編寫內(nèi)核不處理的IP數(shù)據(jù)包,還可以創(chuàng)建自定義的IP數(shù)據(jù)包首部。</p><p> (3)、TCP套接字編程</p>&
15、lt;p> 當使用TCP/IP協(xié)議一發(fā)客戶服務器服務程序時,服務器需要等待任意數(shù)量客戶端的連接,以便以他們提供服務??蛻舳诉B接服務器時,必須先知道服務器的名稱。在TCP/IP中,就是服務器的IP地址和端口號。 bind()函數(shù)實現(xiàn)將服務器綁定到一個已知的名字上的功能。接下來要將服務器套接字設置為監(jiān)聽狀態(tài),這是通過listen()函數(shù)完成的。在監(jiān)聽狀態(tài)下,如果客戶端向服務器發(fā)起連接請求,服務器通過調(diào)用accept()函數(shù)來接受該連
16、接請求。服務器與客戶端完成連接后,就可以進行數(shù)據(jù)通信了。</p><p> 對客戶端來說,首先調(diào)用connect()函數(shù)向服務器發(fā)出連接請求。如果服務器接受了該請求,接下來就可以與服務器通信了。</p><p> 開發(fā)套接字應用程序時,首先應進行Windows Sockets的初始化,加載Windows Sockets的實現(xiàn),然后創(chuàng)建套接字,對TCP套接字來說,需要在socket()函
17、數(shù)或都WSASocket()函數(shù)中指明SOCK_STREAM套接字類型。當服務器和客戶端通信結(jié)束時,關閉套接字,釋放Windows Sockets的實現(xiàn)。</p><p><b> 流程如下:</b></p><p> 服務器:創(chuàng)建套接字—>綁定—>監(jiān)聽—>接受連接—>收發(fā)數(shù)據(jù)—>關閉</p><p> 客戶
18、端:創(chuàng)建套接字—>連接—>收發(fā)數(shù)據(jù)—>關閉</p><p> Windows Sockets API重要函數(shù)說明如下:</p><p> 一、WSAStartup()函數(shù):</p><p> 不管是客戶端還是服務器,開發(fā)Windows Sockets應用程序時,必須首先加載Windows Sockets動態(tài)庫(DLL)。WSAStartup(
19、)函數(shù)實現(xiàn)此項功能。該函數(shù)是套接字 應用程序必須調(diào)用的第一個函數(shù)。</p><p><b> 該函數(shù)聲明如下:</b></p><p> int WSAStartup(</p><p> WORD wVersionRequested,</p><p> LPWSADATA lpWSAData<
20、/p><p><b> );</b></p><p> wVersionRequested:指定準備加載Windows Sockets動態(tài)庫的版本。高字節(jié)指定所需要庫文件的副版本,低字節(jié)指定主版本。在應用程序中可以使用MAKEWORD(X,Y)方便指定該參數(shù)。X是高位字節(jié),Y是低位字節(jié)</p><p> lpWSAData:指向lpwsada
21、ta結(jié)構(gòu)的指針,該參數(shù)返回被加載動態(tài)庫的有關信息。</p><p> WSADATA結(jié)構(gòu)聲明如下:</p><p> #define WSADESCRIPTION_LEN 256</p><p> #define WSASYS_STATUS_LEN 12 </p><p> struct WSAData {</p>&l
22、t;p> WORD wVersion;</p><p> WORD wHighVersion;</p><p> char szDescription[WSADESCRIPTION_LEN+1];</p><p> char szSystemStatus[WSASYSSTATUS_LEN+1];</p><p> unsign
23、ed short iMaxSockets;</p><p> unsigned short iMaxUdpDg;</p><p> char *lpVendorInfo;};</p><p> WSADATA結(jié)構(gòu)被用來保存函數(shù)WSAStartup返回的Windows Sockets初始化信息。</p><p> wVersion :W
24、indows Sockets DLL期望調(diào)用者使用的Windows Sockets規(guī)范的版本。 高位字節(jié)存儲副版本號, 低位字節(jié)存儲主版本號,可以用WORD MAKEWORD(BYTE,BYTE ) 返回這個值,例如:MAKEWORD(1,1)</p><p> wHighVersion :這個DLL能夠支持的Windows Sockets規(guī)范的最高版本。通常它與wVersion相同。</p>&
25、lt;p> szDescription :以null結(jié)尾的ASCII字符串,Windows Sockets DLL將對Windows Sockets實現(xiàn)的描述拷貝到這個字符串中,包括制造商標識。文本(最多可以有256個字符)可以包含任何字符,但是要注意不能包含控制字符和格式字符,應用程序?qū)ζ渥羁赡艿氖褂梅绞绞前阉赡鼙唤財啵╋@示在在狀態(tài)信息中。</p><p> szSystemStatus :以nu
26、ll結(jié)尾的ASCII字符串,Windows Sockets DLL把有關的狀態(tài)或配置信息拷貝到該字符串中。Windows Sockets DLL應當僅在這些信息對用戶或支持人員有用時才使用它們,它不應被作為szDescription域的擴展。</p><p> iMaxSockets :單個進出能夠打開的socket的最大數(shù)目。</p><p> iMaxUdpDg:一個進程發(fā)送或接收
27、的最大數(shù)據(jù)報長度</p><p> lpVendorInfo :指向銷售商的數(shù)據(jù)結(jié)構(gòu)的指針。這個結(jié)構(gòu)的定義(如果有)超出了WindowsSockets規(guī)范的范圍。 </p><p> 二、socket()函數(shù)</p><p> 初始化Windows Sockets DLL之后,創(chuàng)建套接字。socket()函數(shù)和WSASocket()將實現(xiàn)此功能。socket(
28、)函數(shù)聲明如下:</p><p> SOCKET socket(</p><p><b> int af,</b></p><p><b> int type,</b></p><p> int protocol</p><p><b> );</b
29、></p><p> af:協(xié)議地址家族。創(chuàng)建TCP/UDP套接字時該參數(shù)為AF_INET。</p><p> type:協(xié)議的套接字類型。有SOCK_STREAM、SOCK_DGRAM和SOCK_RAM 3種類型</p><p> protocol:協(xié)議。對于SOCK_STREAM套接字類型,該字段為IPPROTO_TCP或為0,對于SOCK_DGRA
30、M套接字類型,該字段為IPPROTO_UDP或為0</p><p> 三、bind()函數(shù)</p><p> bind()函數(shù)將套接字綁定到一個已知的地址。該函數(shù)聲明如下:</p><p><b> int bind(</b></p><p><b> SOCKET s,</b></p
31、><p> const struct sockaddr FAR* name,</p><p> int namelen</p><p><b> );</b></p><p><b> s:套接字</b></p><p><b> name:地址</b&
32、gt;</p><p> namelen:sockaddr結(jié)構(gòu)長度 來源:魁網(wǎng)學習頻道-計算機二級考試</p><p> 四、listen()函數(shù)</p><p> listen()函數(shù)將套接字設置為監(jiān)聽模式。listen()函數(shù)聲明如下:</p><p> int listen(</p><p><b&
33、gt; SOCKET s,</b></p><p> int backlog</p><p><b> );</b></p><p><b> s:套接字</b></p><p> backlog:指定等待連接的最大隊列長度(例如客戶端的同時可連接數(shù))</p>&
34、lt;p> 五、accept()函數(shù)</p><p> accept()函數(shù)實現(xiàn)接受一個連接請求的功能。accept()函數(shù)聲明如下:</p><p> SOCKET accept(</p><p><b> int s;</b></p><p> struct sockaddr FAR* addr,&l
35、t;/p><p> int FAR* addrlen</p><p><b> );</b></p><p><b> s:監(jiān)聽套接字</b></p><p> addr:該參數(shù)返回請求連接的客戶端的地址</p><p> addrlen:該參數(shù)返回SOCKADDR_I
36、N結(jié)構(gòu)的長度</p><p> 六、recv()函數(shù)</p><p> recv()函數(shù)和WSARevc()函數(shù)用于接受數(shù)據(jù)。recv()函數(shù)聲明如下:</p><p><b> int recv(</b></p><p><b> SOCKET s,</b></p><
37、p> char FAR* buf,</p><p><b> int len,</b></p><p><b> int flags</b></p><p><b> );</b></p><p><b> s:套接字</b></p&
38、gt;<p> buf:接收數(shù)據(jù)緩沖區(qū)</p><p> len:緣沖區(qū)的長度</p><p> flags:該參數(shù)影響該函數(shù)的行為。如果為0表示無特殊行為,MSG_PEEK會使有用的數(shù)據(jù)被復制到接收緩沖區(qū)內(nèi),但沒有從系統(tǒng)緩沖區(qū)中將其刪除MSG_OOB表示處理帶外數(shù)據(jù)。 來源:魁網(wǎng)學習頻道-計算機二級考試</p><p> 七、send()函數(shù)
39、</p><p> send()和WSASend()函數(shù)用于發(fā)送數(shù)據(jù)。send()函數(shù)聲明如下:</p><p><b> int send(</b></p><p><b> SOCKET s,</b></p><p> const char FAR* buf,</p>&l
40、t;p><b> int len,</b></p><p> int flags);</p><p><b> s:套接字</b></p><p> buf:發(fā)送數(shù)據(jù)緩沖區(qū)</p><p> len:發(fā)送數(shù)據(jù)長度</p><p> flags:該參數(shù)影響該函
41、數(shù)的行為。如果為0表示無特殊行為,MSG_DONTROUTE要求傳輸層不要將數(shù)據(jù)路由出去,MSG_OOB表示處理帶外數(shù)據(jù)。</p><p> 八、closesocket()函數(shù)</p><p> closesocket()函數(shù)關閉套接字,釋放后占資源。該函數(shù)聲明如下:</p><p> int closesocket(</p><p>
42、<b> SOCKET s</b></p><p><b> );</b></p><p><b> s:套接字</b></p><p> 九、shutdown()函數(shù)</p><p> shutdown()函數(shù)用于通知對方不再發(fā)送數(shù)據(jù),或者不再接收數(shù)據(jù),或者即不發(fā)送
43、也不接收數(shù)據(jù)。該函數(shù)聲明如下:</p><p> int shutdown(</p><p><b> SOCKET s,</b></p><p><b> int how</b></p><p><b> );</b></p><p><
44、b> s:套接字</b></p><p> how:如果參數(shù)為SD_RECEIVE,則表示不允許再調(diào)用接收數(shù)據(jù)函數(shù);如果該參數(shù)為SE_SEND,則表示不允許再調(diào)用發(fā)送數(shù)據(jù)函數(shù);如果該參數(shù)為SE_BOTH,則表示即不允許調(diào)用發(fā)送數(shù)據(jù)函數(shù)也不允許調(diào)用接收數(shù)據(jù)函數(shù)。</p><p> 十、connect()函數(shù)</p><p> connect(
45、)函數(shù)實現(xiàn)連接服務器功能。該函數(shù)聲明如下:</p><p> int connect(</p><p><b> SOCKET s,</b></p><p> const struct sockaddr FAR* name,</p><p> int namelen</p><p><
46、;b> );</b></p><p><b> s:套接字</b></p><p> name:服務器地址</p><p> namelen:sockaddr 結(jié)構(gòu)的長度</p><p> ?。?)、聊天室程序的設計及實現(xiàn)</p><p> ?。?)、PING程序的設計及
47、實現(xiàn)</p><p> 五、實驗調(diào)試結(jié)果及代碼</p><p><b> ?。?)實驗調(diào)試結(jié)果</b></p><p><b> 聊天室實驗:</b></p><p><b> 啟動服務器端</b></p><p><b> 客戶端連接
48、服務器</b></p><p><b> 連接上服務器</b></p><p><b> 開始發(fā)送消息</b></p><p> 服務器端顯示連接狀態(tài)</p><p><b> PING程序?qū)嶒?lt;/b></p><p><b&g
49、t; Ping主機名</b></p><p><b> Ping ip地址</b></p><p><b> ?。?)實驗代碼</b></p><p><b> 1、聊天室實驗</b></p><p><b> 服務器端:</b><
50、;/p><p> using System;</p><p> using System.Collections.Generic;</p><p> using System.ComponentModel;</p><p> using System.Data;</p><p> using System.Dra
51、wing;</p><p> using System.Text;</p><p> using System.Windows.Forms;</p><p> using System.Net;</p><p> using System.Net.Sockets;</p><p> using System.
52、Threading;</p><p> using System.Xml;</p><p> namespace Server</p><p><b> {</b></p><p> public partial class ServerMain : Form</p><p><b&
53、gt; {</b></p><p> public ServerMain()</p><p><b> {</b></p><p> InitializeComponent();</p><p><b> }</b></p><p> private
54、void ServerMain_Load(object sender, EventArgs e)</p><p><b> {</b></p><p> this.CmdStar.Enabled = true;</p><p> this.CmdStop.Enabled = false;</p><p><b
55、> }</b></p><p> private int GetPort()</p><p><b> {</b></p><p> { return 6600; }</p><p><b> }</b></p><p> private IPE
56、ndPoint ServerInfo;</p><p> private Socket ServerSocket;</p><p> private Thread ServerThread; </p><p> private Socket[] ClientSocket;</p><p> private int Clie
57、ntNumb;</p><p> private byte[] MsgBuffer;</p><p> private void CmdStar_Click(object sender, EventArgs e)</p><p><b> {</b></p><p> ServerSocket = new Soc
58、ket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);</p><p> ServerInfo=new IPEndPoint(IPAddress.Any,this.GetPort());</p><p> ServerSocket.Bind(ServerInfo);</p><p&g
59、t; ServerSocket.Listen(10); </p><p> ClientSocket = new Socket[65535];</p><p> MsgBuffer = new byte[65535]; </p><p> ClientNumb = 0;</p><p> ServerThrea
60、d = new Thread(RecieveAccept);</p><p> ServerThread.Start();</p><p> CheckForIllegalCrossThreadCalls = false;</p><p> this.CmdStar.Enabled = false;</p><p> this.Cmd
61、Stop.Enabled = true;</p><p> this.StateMsg.Text = "服¤t務?正y在¨²運?行D..."+" 運?行D端?口¨²:êo"+this.GetPort().ToString();</p><p> this.ClientList.Item
62、s.Add("服¤t務?于®¨² " + DateTime.Now.ToString() + " 開a始º?運?行D.");</p><p><b> } </b></p><p> private void RecieveAccept()</p>&
63、lt;p><b> {</b></p><p> while (true)</p><p><b> {</b></p><p> ClientSocket[ClientNumb] = ServerSocket.Accept(); ClientSocket[
64、ClientNumb].BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack),ClientSocket[ClientNumb]);</p><p> this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString()
65、+" 成¨¦功|連¢?接¨®服¤t務?器¡Â.");</p><p> ClientNumb++;</p><p><b> }</b></p><p><b> }</b></p><p>
66、 private void RecieveCallBack(IAsyncResult AR)</p><p><b> {</b></p><p><b> try</b></p><p><b> {</b></p><p> Socket RSocket = (So
67、cket)AR.AsyncState;</p><p> int REnd = RSocket.EndReceive(AR); string msg = Encoding.UTF8.GetString(MsgBuffer,0,REnd);</p><p> MessageList.Items.Add("["+D
68、ateTime.Now.ToString()+"]"+ msg);</p><p> for (int i = 0; i < ClientNumb; i++)</p><p><b> {</b></p><p> if (ClientSocket[i].Connected)</p><p&g
69、t;<b> {</b></p><p> ClientSocket[i].Send(MsgBuffer, 0, REnd,0); </p><p><b> }</b></p><p> RSocket.BeginReceive(MsgBuffer, 0, MsgBu
70、ffer.Length, 0, new AsyncCallback(RecieveCallBack), RSocket);</p><p><b> }</b></p><p><b> }</b></p><p><b> catch { }</b></p><p>&
71、lt;b> }</b></p><p> private void CmdStop_Click(object sender, EventArgs e) </p><p><b> {</b></p><p> ServerThread.Abort();</p><p> ServerS
72、ocket.Close();</p><p> this.CmdStar.Enabled = true;</p><p> this.CmdStop.Enabled = false;</p><p> this.StateMsg.Text = "等̨¨待äy運?行D...";</p>
73、<p> this.ClientList.Items.Add("服¤t務?于®¨² " + DateTime.Now.ToString() + " 停ª¡ê止1運?行D.");</p><p><b> }</b></p><p> priva
74、te void ServerMain_FormClosing(object sender, FormClosingEventArgs e)</p><p><b> {</b></p><p><b> try</b></p><p><b> {</b></p><p>
75、; ServerThread.Abort();</p><p> ServerSocket.Close();</p><p><b> }</b></p><p><b> catch { }</b></p><p><b> }</b></p><
76、;p><b> }</b></p><p><b> }</b></p><p><b> 客戶端:</b></p><p> using System;</p><p> using System.Collections.Generic;</p>
77、<p> using System.ComponentModel;</p><p> using System.Data;</p><p> using System.Drawing;</p><p> using System.Text;</p><p> using System.Windows.Forms;<
78、/p><p> using System.Net;</p><p> using System.Net.Sockets;</p><p> namespace Client</p><p><b> {</b></p><p> public partial class ClientMain
79、 : Form</p><p><b> {</b></p><p> public ClientMain()</p><p><b> {</b></p><p> InitializeComponent();</p><p><b> }</b&
80、gt;</p><p> private IPEndPoint ServerInfo;</p><p> private Socket ClientSocket;</p><p> private Byte[] MsgBuffer;</p><p> private Byte[] MsgSend;</p><p&g
81、t; private void Connection() {</p><p> this.CmdSend.Enabled = false;</p><p> this.CmdExit.Enabled = false;</p><p> ClientSocket = new Socket(AddressFamily.Inter
82、Network, SocketType.Stream, ProtocolType.Tcp); </p><p> MsgBuffer = new Byte[65535]; </p><p> MsgSend = new Byte[65535];</p><p> CheckForIllegalCrossThreadCalls = fals
83、e; </p><p> Random TRand = new Random();</p><p> this.UserName.Text = "Tina" + TRand.Next(10000).ToString();</p><p><b> }</b></p><p>
84、private void ClientMain_Load(object sender, EventArgs e) </p><p><b> {</b></p><p> Connection();</p><p><b> }</b></p><p> private void C
85、mdEnter_Click(object sender, EventArgs e) </p><p><b> {</b></p><p> if (ClientSocket == null || !ClientSocket.Connected)</p><p><b> {</b></p>
86、<p> Connection();</p><p><b> }</b></p><p> ServerInfo = new IPEndPoint(IPAddress.Parse(this.ServerIP.Text), Convert.ToInt32(this.ServerPort.Text));</p><p><b
87、> try</b></p><p><b> {</b></p><p> ClientSocket.Connect(ServerInfo);</p><p> ClientSocket.Send(Encoding.UTF8.GetBytes("用®?戶¡ì: " +
88、this.UserName.Text + " 進?入¨?系¦Ì統(tǒng)ª3!ê?\n"));</p><p> ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);</p><
89、p> this.LoginList.Items.Add("["+DateTime.Now.ToString()+"]"+"登Ì?錄?服¤t務?器¡Â成¨¦功|!ê?");</p><p> this.CmdSend.Enabled = true;</p><
90、;p> this.CmdEnter.Enabled = false;</p><p> this.CmdExit.Enabled = true;</p><p><b> }</b></p><p><b> catch</b></p><p><b> {</b&g
91、t;</p><p> MessageBox.Show("登Ì?錄?服¤t務?器¡Â失º¡ì敗㨹,ê?請?確¨¡¤認¨?服¤t務?器¡Â是º?否¤?正y常¡ê工¡
92、2;作Á¡Â!ê?", "提¬¨¢示º?", MessageBoxButtons.OK, MessageBoxIcon.Information);</p><p><b> }</b></p><p><b> }</b></p
93、><p> private void ReceiveCallBack(IAsyncResult AR) {</p><p><b> try</b></p><p><b> {</b></p><p> int REnd = ClientSo
94、cket.EndReceive(AR);</p><p> this.RecieveMsg.AppendText(Encoding.UTF8.GetString(MsgBuffer, 0, REnd)); ClientSocket.BeginReceive(MsgBuffer,0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCall
95、Back), null);</p><p><b> }</b></p><p><b> catch</b></p><p><b> {</b></p><p> CmdExit_Click(null, null);</p><p> Me
96、ssageBox.Show("已°?經(jīng)-與®?服¤t務?器¡Â斷?開a連¢?接¨®!ê?", "提¬¨¢示º?", MessageBoxButtons.OK, MessageBoxIcon.Information);</p><p><b&
97、gt; }</b></p><p><b> }</b></p><p> private void CmdSend_Click(object sender, EventArgs e) {</p><p> MsgSend = Encoding.UTF8.GetBytes(this.UserN
98、ame.Text + "說¦Ì:" + this.SendMsg.Text + "\n");</p><p> if (ClientSocket.Connected)</p><p><b> {</b></p><p> ClientSocket.Send(MsgSend);&
99、lt;/p><p> this.SendMsg.Text = "";</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> CmdExit_Cl
100、ick(null, null);</p><p> MessageBox.Show("當Ì¡À前¡ã與®?服¤t務?器¡Â斷?開a連¢?接¨®,ê?無T法¤¡§發(fā)¤¡é送¨ª信?息¡&
101、#233;!ê?","提¬¨¢示º?",MessageBoxButtons.OK,MessageBoxIcon.Information);</p><p><b> }</b></p><p><b> }</b></p><p> pr
102、ivate void CmdExit_Click(object sender, EventArgs e) {</p><p> this.LoginList.Items.Add("[" + DateTime.Now.ToString() + "]" + "退ª?出?服¤t務?器¡Â!
103、34;?");</p><p> if (ClientSocket.Connected)</p><p><b> {</b></p><p> string msg = this.UserName.Text + "離¤?開a了¢?房¤?間?!ê?\n";</p&
104、gt;<p> ClientSocket.Send(Encoding.UTF8.GetBytes(msg));</p><p> ClientSocket.Shutdown(SocketShutdown.Both);</p><p> ClientSocket.Disconnect(false);</p><p><b> }<
105、/b></p><p> ClientSocket.Close();</p><p> this.CmdSend.Enabled = false;</p><p> this.CmdEnter.Enabled = true;</p><p> this.CmdExit.Enabled = false;</p>&l
106、t;p><b> }</b></p><p> private void RecieveMsg_TextChanged(object sender, EventArgs e)</p><p><b> {</b></p><p> this.RecieveMsg.ScrollToCaret();</p&
107、gt;<p><b> }</b></p><p> private void SendMsg_KeyDown(object sender, KeyEventArgs e)</p><p><b> {</b></p><p> if (e.Control && e.KeyValue
108、== 13)</p><p><b> {</b></p><p> e.Handled = true;</p><p> this.CmdSend_Click(this, null);</p><p><b> }</b></p><p><b> }&
109、lt;/b></p><p><b> }</b></p><p><b> }</b></p><p><b> Ping程序?qū)嶒灒?lt;/b></p><p> using System;</p><p> using System.Co
110、llections.Generic;</p><p> using System.ComponentModel;</p><p> using System.Data;</p><p> using System.Drawing;</p><p> using System.Linq;</p><p> us
111、ing System.Text;</p><p> using System.Windows.Forms;</p><p> using System.Net.NetworkInformation;</p><p> namespace 編À¨¤程¨¬實º¦Ì現(xiàn)?Ping操
112、8;´作Á¡Â</p><p><b> {</b></p><p> public partial class Form1 : Form</p><p><b> {</b></p><p> public Form1()</p>&l
113、t;p><b> {</b></p><p> InitializeComponent();</p><p><b> }</b></p><p> private void button1_Click(object sender, EventArgs e)</p><p><b
114、> {</b></p><p> listBox1.Items.Clear();</p><p><b> try</b></p><p><b> {</b></p><p> Ping PingInfo = new Ping();</p><p&g
115、t; PingOptions PingOpt = new PingOptions();</p><p> PingOpt.DontFragment = true;</p><p> string myInfo = "hrkhyworkk";</p><p> byte[] bufferInfo = Encoding.ASCII.GetBy
116、tes(myInfo);</p><p> int TimeOut = 120;</p><p> PingReply reply = PingInfo.Send(this.textBox1.Text, TimeOut, bufferInfo, PingOpt);</p><p> if (reply.Status == IPStatus.Success)&l
117、t;/p><p><b> {</b></p><p> this.listBox1.Items.Add( "網(wǎng)ª?絡?傳ä?輸º?時º¡À間?:êo" + reply.RoundtripTime.ToString());</p><p> this.l
118、istBox1.Items.Add("可¨¦以°?轉(zhuǎn)Áa發(fā)¤¡é該?數(shù)ºy據(jù)Y的Ì?路¡¤由®¨¦節(jié)¨²點Ì?數(shù)ºy:êo" + reply.Options.Ttl.ToString());</p><p>
119、; this.listBox1.Items.Add( "遠?程¨¬主¡Â機¨²是º?否¤?分¤?段?:êo" + reply.Options.DontFragment.ToString());</p><p> this.listBox1.Items.Add( "緩o沖?區(qū)?大
120、228;¨®小?:êo" + reply.Buffer.Length.ToString());</p><p> this.listBox1.Items.Add("連¢?接¨®狀Á¡ä況?:êo" + reply.Status.ToString());</p><
121、p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> MessageBox.Show("無T法¤¡§Ping通ª¡§");</p&
122、gt;<p><b> }</b></p><p><b> }</b></p><p> catch (Exception ey)</p><p><b> {</b></p><p> MessageBox.Show(ey.Message);<
123、/p><p><b> }</b></p><p><b> }</b></p><p> private void Form1_Load(object sender, EventArgs e)</p><p><b> {</b></p><p>
124、<b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 六、實驗小結(jié):</b></p><p> 通過兩個星期的實驗,是我更加深刻的了解了網(wǎng)絡編程是如何運行實現(xiàn)的思想。更加深刻認
125、知了所學網(wǎng)絡理論,通過編寫程序的方法形象具體的展示了網(wǎng)絡中是如何通訊的,icmp報文是如何定義,如何工作的。這個課設的完成,是我更加熟練的學習了在visual 2010</p><p> 環(huán)境先的編程,通過練習套接字編程,是我了解到了tcp/ip套接字是如何實現(xiàn)網(wǎng)絡通訊的,由開始的一無所知到現(xiàn)在的了解,我覺得是一個進步。客戶端首先創(chuàng)建套接字,然后連接服務器,然后收發(fā)數(shù)據(jù),最后關閉;而服務器端,創(chuàng)建套接字綁定,監(jiān)
126、聽,接受連接,收發(fā)數(shù)據(jù),關閉。最后通過學習,寫出了聊天室程序和ping程序,使得對網(wǎng)絡編程有所了解。總之,這次課設有了很大的收獲。</p><p><b> 指導老師意見:</b></p><p> 成績: 教師簽名: </p><p> 年
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡編程課程設計---網(wǎng)絡聊天室
- atm網(wǎng)絡編程cs課程設計--模擬atm機網(wǎng)絡編程
- web課程設計 《web網(wǎng)絡編程技術(shù)》課程設計報告
- 《網(wǎng)絡編程與協(xié)議分析》課程設計--網(wǎng)絡數(shù)據(jù)包抓取與分析軟件
- 網(wǎng)絡編程課程設計-網(wǎng)路嗅探器
- 網(wǎng)絡編程課程設計-java聊天室
- 計算機網(wǎng)絡課程設計--基于tcp協(xié)議編程的網(wǎng)絡聊天室
- 網(wǎng)絡編程課程設計報告--圖片瀏覽器
- 網(wǎng)絡構(gòu)建與協(xié)議分析課程設計
- 網(wǎng)絡編程課程設計(局域網(wǎng)信息廣播)
- 課程設計--時間編程
- 網(wǎng)絡編程課程設計報告--基于linux網(wǎng)絡聊天室設計
- 網(wǎng)絡協(xié)議實踐教程課程設計--網(wǎng)絡拓撲構(gòu)建與協(xié)議分析
- 網(wǎng)絡課程設計---使用vc++編程實現(xiàn)網(wǎng)絡嗅探器
- 網(wǎng)絡協(xié)議分析與仿真課程設計報告
- 網(wǎng)絡編程課程設計報告--- 網(wǎng)上汽車租賃系統(tǒng)
- 網(wǎng)絡編程課程設計報告--模擬火車售票退票系統(tǒng)
- 數(shù)控編程加工課程設計
- 數(shù)控程序編程課程設計
- 計算機網(wǎng)絡課程設計- 編程實現(xiàn)telnet協(xié)議的基本功能
評論
0/150
提交評論