版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 設(shè)計(jì)名稱: 網(wǎng)絡(luò)協(xié)議編程應(yīng)用課程設(shè)計(jì) </p><p> 系 (院): 機(jī)算計(jì)科學(xué)學(xué)院 </p><p> 專業(yè)班級(jí): 網(wǎng)絡(luò)11003班 </p><p&
2、gt; 姓 名: </p><p> 學(xué) 號(hào): </p><p> 指導(dǎo)教師: </p><p> 設(shè)計(jì)時(shí)間: 2013.6.7 - 2013.6.18 </p><p> 設(shè)
3、計(jì)地點(diǎn): 四號(hào)樓1樓2號(hào)機(jī)房 </p><p><b> 一、目的與任務(wù)</b></p><p> 網(wǎng)絡(luò)協(xié)議編程應(yīng)用課程設(shè)計(jì)是《TCP/IP協(xié)議分析》課程后的一個(gè)重要的教學(xué)環(huán)節(jié),是對(duì)學(xué)生進(jìn)行的一次較為全面的網(wǎng)絡(luò)協(xié)議編程方面的訓(xùn)練。其基本目的是:</p><p> ?。?)培養(yǎng)學(xué)生理論聯(lián)系實(shí)際的設(shè)計(jì)思想,訓(xùn)練綜合運(yùn)
4、用所學(xué)的基礎(chǔ)理論知識(shí),結(jié)合生產(chǎn)實(shí)際分析和解決網(wǎng)絡(luò)應(yīng)用中問(wèn)題的能力,從而使基礎(chǔ)理論知識(shí)得到鞏固和加深。</p><p> ?。?)通過(guò)編程實(shí)踐學(xué)習(xí)掌握網(wǎng)絡(luò)協(xié)議的運(yùn)行原理。</p><p> ?。?)練習(xí)多線程的網(wǎng)絡(luò)編程模式,為以后開(kāi)發(fā)真實(shí)的應(yīng)用協(xié)議打下基礎(chǔ)。</p><p><b> 二、基本要求</b></p><p>
5、; ?。?)合理設(shè)計(jì)系統(tǒng)框圖和程序結(jié)構(gòu)圖。</p><p> ?。?)根據(jù)系統(tǒng)框圖設(shè)計(jì),編寫程序代碼。</p><p> ?。?)編寫程序說(shuō)明書。</p><p><b> 三、實(shí)驗(yàn)環(huán)境</b></p><p> 安裝有vs2010以及虛擬機(jī)的計(jì)算機(jī)</p><p><b> 四、
6、課程設(shè)計(jì)內(nèi)容</b></p><p> (1)、熟悉開(kāi)發(fā)工具</p><p> Visual Studio是微軟公司推出的開(kāi)發(fā)環(huán)境。是目前最流行的Windows平臺(tái)應(yīng)用程序開(kāi)發(fā)環(huán)境。Visual Studio 2010版本于2010年4月12日上市,其集成開(kāi)發(fā)環(huán)境(IDE)的界面被重新設(shè)計(jì)和組織,變得更加簡(jiǎn)單明了。Visual Studio 2010同時(shí)帶來(lái)了 NET F
7、ramework 4.0、Microsoft Visual Studio 2010 CTP( Community Technology Preview--CTP),并且支持開(kāi)發(fā)面向Windows 7的應(yīng)用程序。除了Microsoft SQL Server,它還支持 IBM DB2和Oracle數(shù)據(jù)庫(kù)。學(xué)習(xí)使用好vs2010對(duì)于我們來(lái)說(shuō)有很大意義。</p><p> ?。?)、套接字編程練習(xí)</p>
8、<p> 使用TCP/IP協(xié)議的應(yīng)用程序通常采用兩種應(yīng)用編程接口(API):socket和TLI(運(yùn)輸層接)。前者有時(shí)稱作"Berkeley socket",表明它是從伯克利版發(fā)展而來(lái)的。后者起初是由AT & T開(kāi)發(fā)的,有時(shí)稱作XTI(X/Open運(yùn)輸層接口),以承認(rèn)X/Open這個(gè)自己定義標(biāo)準(zhǔn)的國(guó)際計(jì)算機(jī)生產(chǎn)商所做的工作。XTI實(shí)際上是TLI的一個(gè)超集。而在windows操作系統(tǒng)中,實(shí)現(xiàn)了win
9、dows版本的socketAPI,又稱winsock。</p><p> TCP/IP還是OSI的ISO協(xié)議都是分層模式的,用層的概念屏蔽的下層的細(xì)節(jié),只要完成自層的功能即可,因而程序員在做網(wǎng)絡(luò)編程時(shí)并不需要去關(guān)心網(wǎng)絡(luò)底層的具體實(shí)現(xiàn),只需要關(guān)心軟件的功能即可極大的簡(jiǎn)化了程序的編寫。因而我們?cè)趯W(xué)習(xí)網(wǎng)絡(luò)socket編程時(shí)并不一定要很多的網(wǎng)絡(luò)方面的知識(shí),甚至是TCP/IP協(xié)議的知識(shí)也不需要太多。因而在著我就不介紹那方
10、面的知識(shí)了,如果要了解網(wǎng)上也四處都有那些被別人應(yīng)用了N遍的經(jīng)典的介紹。 在這只介紹基于TCP和UDP的簡(jiǎn)單的編程實(shí)現(xiàn)。</p><p> 現(xiàn)今的網(wǎng)絡(luò)程序一般都是基于C/S模型,即客戶機(jī)-服務(wù)器模型。這種結(jié)構(gòu)將主要運(yùn)算操作放在中心計(jì)算機(jī)上。同集中式大型計(jì)算系統(tǒng)比較,"客戶-服務(wù)器"結(jié)構(gòu)的主要優(yōu)點(diǎn) 是提供了良好的實(shí)用性、靈活性、交互性和可擴(kuò)展性。"客戶-服務(wù)器"以數(shù)據(jù)庫(kù)服務(wù)器
11、取代集中式文件共享進(jìn)而實(shí)現(xiàn)了計(jì)算機(jī)系統(tǒng)之間的松耦合。</p><p> Windows Sockets是Microsoft Windows的網(wǎng)絡(luò)程序設(shè)計(jì)接口,它是從Berkeley Sockets擴(kuò)展而來(lái)的,以動(dòng)態(tài)鏈接庫(kù)的形式提供給我們使用。Windows Sockets在繼承了Berkeley Sockets主要特征的基礎(chǔ)上,又對(duì)它進(jìn)行了重要擴(kuò)充。這些擴(kuò)充主要是提供了一些異步函數(shù),并增加了符合Windows消
12、息驅(qū)動(dòng)特性的網(wǎng)絡(luò)事件異步選擇機(jī)制。Windows Sockets 1.1和Berkeley Sockets都是基于TCP/IP協(xié)議的;Windows Sockets 2從Windows Sockets 1.1發(fā)展而來(lái),與協(xié)議無(wú)關(guān)并向下兼容,可以使用任何底 層傳輸協(xié)議提供的通信能力,來(lái)為上層應(yīng)用程序完成網(wǎng)絡(luò)數(shù)據(jù)通訊,而不關(guān)心底層網(wǎng)絡(luò)鏈路的通訊情況,真正實(shí)現(xiàn)了底層網(wǎng)絡(luò)通訊對(duì)應(yīng)用程序的透明。</p><p> 套接字
13、的類型總共有三類:</p><p> 1) 流式套接字(SOCK_STREAM)</p><p> 提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無(wú)差錯(cuò)、無(wú)重復(fù)的發(fā)送,且按發(fā)送順序接收。這種類型是基于TCP協(xié)議的。</p><p> 2) 數(shù)據(jù)報(bào)式套接字(SOCK_DGRAM)</p><p> 提供無(wú)連接服務(wù)。數(shù)據(jù)包以獨(dú)立包形式發(fā)送,不
14、提供無(wú)錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),并且接收順序混亂。 這種類型是基于UDP協(xié)議的</p><p> 3) 原始套接字(SOCK_RAW)。</p><p> 用于編寫基于IP協(xié)議的程序。 它可以訪問(wèn)ICMP和ICMP等協(xié)議包,可以編寫內(nèi)核不處理的IP數(shù)據(jù)包,還可以創(chuàng)建自定義的IP數(shù)據(jù)包首部。</p><p> ?。?)、TCP套接字編程</p>&
15、lt;p> 當(dāng)使用TCP/IP協(xié)議一發(fā)客戶服務(wù)器服務(wù)程序時(shí),服務(wù)器需要等待任意數(shù)量客戶端的連接,以便以他們提供服務(wù)。客戶端連接服務(wù)器時(shí),必須先知道服務(wù)器的名稱。在TCP/IP中,就是服務(wù)器的IP地址和端口號(hào)。 bind()函數(shù)實(shí)現(xiàn)將服務(wù)器綁定到一個(gè)已知的名字上的功能。接下來(lái)要將服務(wù)器套接字設(shè)置為監(jiān)聽(tīng)狀態(tài),這是通過(guò)listen()函數(shù)完成的。在監(jiān)聽(tīng)狀態(tài)下,如果客戶端向服務(wù)器發(fā)起連接請(qǐng)求,服務(wù)器通過(guò)調(diào)用accept()函數(shù)來(lái)接受該連
16、接請(qǐng)求。服務(wù)器與客戶端完成連接后,就可以進(jìn)行數(shù)據(jù)通信了。</p><p> 對(duì)客戶端來(lái)說(shuō),首先調(diào)用connect()函數(shù)向服務(wù)器發(fā)出連接請(qǐng)求。如果服務(wù)器接受了該請(qǐng)求,接下來(lái)就可以與服務(wù)器通信了。</p><p> 開(kāi)發(fā)套接字應(yīng)用程序時(shí),首先應(yīng)進(jìn)行Windows Sockets的初始化,加載Windows Sockets的實(shí)現(xiàn),然后創(chuàng)建套接字,對(duì)TCP套接字來(lái)說(shuō),需要在socket()函
17、數(shù)或都WSASocket()函數(shù)中指明SOCK_STREAM套接字類型。當(dāng)服務(wù)器和客戶端通信結(jié)束時(shí),關(guān)閉套接字,釋放Windows Sockets的實(shí)現(xiàn)。</p><p><b> 流程如下:</b></p><p> 服務(wù)器:創(chuàng)建套接字—>綁定—>監(jiān)聽(tīng)—>接受連接—>收發(fā)數(shù)據(jù)—>關(guān)閉</p><p> 客戶
18、端:創(chuàng)建套接字—>連接—>收發(fā)數(shù)據(jù)—>關(guān)閉</p><p> Windows Sockets API重要函數(shù)說(shuō)明如下:</p><p> 一、WSAStartup()函數(shù):</p><p> 不管是客戶端還是服務(wù)器,開(kāi)發(fā)Windows Sockets應(yīng)用程序時(shí),必須首先加載Windows Sockets動(dòng)態(tài)庫(kù)(DLL)。WSAStartup(
19、)函數(shù)實(shí)現(xiàn)此項(xiàng)功能。該函數(shù)是套接字 應(yīng)用程序必須調(diào)用的第一個(gè)函數(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:指定準(zhǔn)備加載Windows Sockets動(dòng)態(tài)庫(kù)的版本。高字節(jié)指定所需要庫(kù)文件的副版本,低字節(jié)指定主版本。在應(yīng)用程序中可以使用MAKEWORD(X,Y)方便指定該參數(shù)。X是高位字節(jié),Y是低位字節(jié)</p><p> lpWSAData:指向lpwsada
21、ta結(jié)構(gòu)的指針,該參數(shù)返回被加載動(dòng)態(tài)庫(kù)的有關(guān)信息。</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)被用來(lái)保存函數(shù)WSAStartup返回的Windows Sockets初始化信息。</p><p> wVersion :W
24、indows Sockets DLL期望調(diào)用者使用的Windows Sockets規(guī)范的版本。 高位字節(jié)存儲(chǔ)副版本號(hào), 低位字節(jié)存儲(chǔ)主版本號(hào),可以用WORD MAKEWORD(BYTE,BYTE ) 返回這個(gè)值,例如:MAKEWORD(1,1)</p><p> wHighVersion :這個(gè)DLL能夠支持的Windows Sockets規(guī)范的最高版本。通常它與wVersion相同。</p>&
25、lt;p> szDescription :以null結(jié)尾的ASCII字符串,Windows Sockets DLL將對(duì)Windows Sockets實(shí)現(xiàn)的描述拷貝到這個(gè)字符串中,包括制造商標(biāo)識(shí)。文本(最多可以有256個(gè)字符)可以包含任何字符,但是要注意不能包含控制字符和格式字符,應(yīng)用程序?qū)ζ渥羁赡艿氖褂梅绞绞前阉赡鼙唤財(cái)啵╋@示在在狀態(tài)信息中。</p><p> szSystemStatus :以nu
26、ll結(jié)尾的ASCII字符串,Windows Sockets DLL把有關(guān)的狀態(tài)或配置信息拷貝到該字符串中。Windows Sockets DLL應(yīng)當(dāng)僅在這些信息對(duì)用戶或支持人員有用時(shí)才使用它們,它不應(yīng)被作為szDescription域的擴(kuò)展。</p><p> iMaxSockets :單個(gè)進(jìn)出能夠打開(kāi)的socket的最大數(shù)目。</p><p> iMaxUdpDg:一個(gè)進(jìn)程發(fā)送或接收
27、的最大數(shù)據(jù)報(bào)長(zhǎng)度</p><p> lpVendorInfo :指向銷售商的數(shù)據(jù)結(jié)構(gòu)的指針。這個(gè)結(jié)構(gòu)的定義(如果有)超出了WindowsSockets規(guī)范的范圍。 </p><p> 二、socket()函數(shù)</p><p> 初始化Windows Sockets DLL之后,創(chuàng)建套接字。socket()函數(shù)和WSASocket()將實(shí)現(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í)該參數(shù)為AF_INET。</p><p> type:協(xié)議的套接字類型。有SOCK_STREAM、SOCK_DGRAM和SOCK_RAM 3種類型</p><p> protocol:協(xié)議。對(duì)于SOCK_STREAM套接字類型,該字段為IPPROTO_TCP或?yàn)?,對(duì)于SOCK_DGRA
30、M套接字類型,該字段為IPPROTO_UDP或?yàn)?</p><p> 三、bind()函數(shù)</p><p> bind()函數(shù)將套接字綁定到一個(gè)已知的地址。該函數(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)長(zhǎng)度 來(lái)源:魁網(wǎng)學(xué)習(xí)頻道-計(jì)算機(jī)二級(jí)考試</p><p> 四、listen()函數(shù)</p><p> listen()函數(shù)將套接字設(shè)置為監(jiān)聽(tīng)模式。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:指定等待連接的最大隊(duì)列長(zhǎng)度(例如客戶端的同時(shí)可連接數(shù))</p>&
34、lt;p> 五、accept()函數(shù)</p><p> accept()函數(shù)實(shí)現(xiàn)接受一個(gè)連接請(qǐng)求的功能。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)聽(tīng)套接字</b></p><p> addr:該參數(shù)返回請(qǐng)求連接的客戶端的地址</p><p> addrlen:該參數(shù)返回SOCKADDR_I
36、N結(jié)構(gòu)的長(zhǎng)度</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ū)的長(zhǎng)度</p><p> flags:該參數(shù)影響該函數(shù)的行為。如果為0表示無(wú)特殊行為,MSG_PEEK會(huì)使有用的數(shù)據(jù)被復(fù)制到接收緩沖區(qū)內(nèi),但沒(méi)有從系統(tǒng)緩沖區(qū)中將其刪除MSG_OOB表示處理帶外數(shù)據(jù)。 來(lái)源:魁網(wǎng)學(xué)習(xí)頻道-計(jì)算機(jī)二級(jí)考試</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ù)長(zhǎng)度</p><p> flags:該參數(shù)影響該函
41、數(shù)的行為。如果為0表示無(wú)特殊行為,MSG_DONTROUTE要求傳輸層不要將數(shù)據(jù)路由出去,MSG_OOB表示處理帶外數(shù)據(jù)。</p><p> 八、closesocket()函數(shù)</p><p> closesocket()函數(shù)關(guān)閉套接字,釋放后占資源。該函數(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ù)用于通知對(duì)方不再發(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ù)實(shí)現(xiàn)連接服務(wù)器功能。該函數(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:服務(wù)器地址</p><p> namelen:sockaddr 結(jié)構(gòu)的長(zhǎng)度</p><p> ?。?)、聊天室程序的設(shè)計(jì)及實(shí)現(xiàn)</p><p> (5)、PING程序的設(shè)計(jì)及
47、實(shí)現(xiàn)</p><p> 五、實(shí)驗(yàn)調(diào)試結(jié)果及代碼</p><p><b> ?。?)實(shí)驗(yàn)調(diào)試結(jié)果</b></p><p><b> 聊天室實(shí)驗(yàn):</b></p><p><b> 啟動(dòng)服務(wù)器端</b></p><p><b> 客戶端連接
48、服務(wù)器</b></p><p><b> 連接上服務(wù)器</b></p><p><b> 開(kāi)始發(fā)送消息</b></p><p> 服務(wù)器端顯示連接狀態(tài)</p><p><b> PING程序?qū)嶒?yàn)</b></p><p><b&g
49、t; Ping主機(jī)名</b></p><p><b> Ping ip地址</b></p><p><b> ?。?)實(shí)驗(yàn)代碼</b></p><p><b> 1、聊天室實(shí)驗(yàn)</b></p><p><b> 服務(wù)器端:</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務(wù)?正y在¨²運(yùn)?行D..."+" 運(yùn)?行D端?口¨²:êo"+this.GetPort().ToString();</p><p> this.ClientList.Item
62、s.Add("服¤t務(wù)?于®¨² " + DateTime.Now.ToString() + " 開(kāi)a始º?運(yùn)?行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務(wù)?器¡Â.");</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運(yùn)?行D...";</p>
73、<p> this.ClientList.Items.Add("服¤t務(wù)?于®¨² " + DateTime.Now.ToString() + " 停ª¡ê止1運(yùn)?行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 + " 進(jìn)?入¨?系¦Ì統(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務(wù)?器¡Â成¨¦功|!ê?");</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務(wù)?器¡Â失º¡ì敗㨹,ê?請(qǐng)?確¨¡¤認(rèn)¨?服¤t務(wù)?器¡Â是º?否¤?正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務(wù)?器¡Â斷?開(kāi)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 + "說(shuō)¦Ì:" + 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("當(dāng)Ì¡À前¡ã與®?服¤t務(wù)?器¡Â斷?開(kāi)a連¢?接¨®,ê?無(wú)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務(wù)?器¡Â!
103、34;?");</p><p> if (ClientSocket.Connected)</p><p><b> {</b></p><p> string msg = this.UserName.Text + "離¤?開(kāi)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ū)嶒?yàn):</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 編À¨¤程¨¬實(shí)º¦Ì現(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)ª?絡(luò)?傳ä?輸º?時(shí)º¡À間?:êo" + reply.RoundtripTime.ToString());</p><p> this.l
118、istBox1.Items.Add("可¨¦以°?轉(zhuǎn)Áa發(fā)¤¡é該?數(shù)ºy據(jù)Y的Ì?路¡¤由®¨¦節(jié)¨²點(diǎn)Ì?數(shù)ºy:êo" + reply.Options.Ttl.ToString());</p><p>
119、; this.listBox1.Items.Add( "遠(yuǎn)?程¨¬主¡Â機(jī)¨²是º?否¤?分¤?段?:ê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("無(wú)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> 六、實(shí)驗(yàn)小結(jié):</b></p><p> 通過(guò)兩個(gè)星期的實(shí)驗(yàn),是我更加深刻的了解了網(wǎng)絡(luò)編程是如何運(yùn)行實(shí)現(xiàn)的思想。更加深刻認(rèn)
125、知了所學(xué)網(wǎng)絡(luò)理論,通過(guò)編寫程序的方法形象具體的展示了網(wǎng)絡(luò)中是如何通訊的,icmp報(bào)文是如何定義,如何工作的。這個(gè)課設(shè)的完成,是我更加熟練的學(xué)習(xí)了在visual 2010</p><p> 環(huán)境先的編程,通過(guò)練習(xí)套接字編程,是我了解到了tcp/ip套接字是如何實(shí)現(xiàn)網(wǎng)絡(luò)通訊的,由開(kāi)始的一無(wú)所知到現(xiàn)在的了解,我覺(jué)得是一個(gè)進(jìn)步??蛻舳耸紫葎?chuàng)建套接字,然后連接服務(wù)器,然后收發(fā)數(shù)據(jù),最后關(guān)閉;而服務(wù)器端,創(chuàng)建套接字綁定,監(jiān)
126、聽(tīng),接受連接,收發(fā)數(shù)據(jù),關(guān)閉。最后通過(guò)學(xué)習(xí),寫出了聊天室程序和ping程序,使得對(duì)網(wǎng)絡(luò)編程有所了解??傊?,這次課設(shè)有了很大的收獲。</p><p><b> 指導(dǎo)老師意見(jiàn):</b></p><p> 成績(jī): 教師簽名: </p><p> 年
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)---網(wǎng)絡(luò)聊天室
- atm網(wǎng)絡(luò)編程cs課程設(shè)計(jì)--模擬atm機(jī)網(wǎng)絡(luò)編程
- web課程設(shè)計(jì) 《web網(wǎng)絡(luò)編程技術(shù)》課程設(shè)計(jì)報(bào)告
- 《網(wǎng)絡(luò)編程與協(xié)議分析》課程設(shè)計(jì)--網(wǎng)絡(luò)數(shù)據(jù)包抓取與分析軟件
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-網(wǎng)路嗅探器
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-java聊天室
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)--基于tcp協(xié)議編程的網(wǎng)絡(luò)聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告--圖片瀏覽器
- 網(wǎng)絡(luò)構(gòu)建與協(xié)議分析課程設(shè)計(jì)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)(局域網(wǎng)信息廣播)
- 課程設(shè)計(jì)--時(shí)間編程
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告--基于linux網(wǎng)絡(luò)聊天室設(shè)計(jì)
- 網(wǎng)絡(luò)協(xié)議實(shí)踐教程課程設(shè)計(jì)--網(wǎng)絡(luò)拓?fù)錁?gòu)建與協(xié)議分析
- 網(wǎng)絡(luò)課程設(shè)計(jì)---使用vc++編程實(shí)現(xiàn)網(wǎng)絡(luò)嗅探器
- 網(wǎng)絡(luò)協(xié)議分析與仿真課程設(shè)計(jì)報(bào)告
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告--- 網(wǎng)上汽車租賃系統(tǒng)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告--模擬火車售票退票系統(tǒng)
- 數(shù)控編程加工課程設(shè)計(jì)
- 數(shù)控程序編程課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)- 編程實(shí)現(xiàn)telnet協(xié)議的基本功能
評(píng)論
0/150
提交評(píng)論