2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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)用中問題的能力,從而使基礎(chǔ)理論知識(shí)得到鞏固和加深。</p><p> ?。?)通過編程實(shí)踐學(xué)習(xí)掌握網(wǎng)絡(luò)協(xié)議的運(yùn)行原理。</p><p>  (3)練習(xí)多線程的網(wǎng)絡(luò)編程模式,為以后開發(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>  (3)編寫程序說明書。</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> ?。?)、熟悉開發(fā)工具</p><p>  Visual Studio是微軟公司推出的開發(fā)環(huán)境。是目前最流行的Windows平臺(tái)應(yīng)用程序開發(fā)環(huán)境。Visual Studio 2010版本于2010年4月12日上市,其集成開發(fā)環(huán)境(IDE)的界面被重新設(shè)計(jì)和組織,變得更加簡(jiǎn)單明了。Visual Studio 2010同時(shí)帶來了 NET F

7、ramework 4.0、Microsoft Visual Studio 2010 CTP( Community Technology Preview--CTP),并且支持開發(fā)面向Windows 7的應(yīng)用程序。除了Microsoft SQL Server,它還支持 IBM DB2和Oracle數(shù)據(jù)庫(kù)。學(xué)習(xí)使用好vs2010對(duì)于我們來說有很大意義。</p><p> ?。?)、套接字編程練習(xí)</p>

8、<p>  使用TCP/IP協(xié)議的應(yīng)用程序通常采用兩種應(yīng)用編程接口(API):socket和TLI(運(yùn)輸層接)。前者有時(shí)稱作"Berkeley socket",表明它是從伯克利版發(fā)展而來的。后者起初是由AT & T開發(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ò)展而來的,以動(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ā)展而來,與協(xié)議無關(guān)并向下兼容,可以使用任何底 層傳輸協(xié)議提供的通信能力,來為上層應(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ù)無差錯(cuò)、無重復(fù)的發(fā)送,且按發(fā)送順序接收。這種類型是基于TCP協(xié)議的。</p><p>  2) 數(shù)據(jù)報(bào)式套接字(SOCK_DGRAM)</p><p>  提供無連接服務(wù)。數(shù)據(jù)包以獨(dú)立包形式發(fā)送,不

14、提供無錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),并且接收順序混亂。 這種類型是基于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>  當(dāng)使用TCP/IP協(xié)議一發(fā)客戶服務(wù)器服務(wù)程序時(shí),服務(wù)器需要等待任意數(shù)量客戶端的連接,以便以他們提供服務(wù)??蛻舳诉B接服務(wù)器時(shí),必須先知道服務(wù)器的名稱。在TCP/IP中,就是服務(wù)器的IP地址和端口號(hào)。 bind()函數(shù)實(shí)現(xiàn)將服務(wù)器綁定到一個(gè)已知的名字上的功能。接下來要將服務(wù)器套接字設(shè)置為監(jiān)聽狀態(tài),這是通過listen()函數(shù)完成的。在監(jiān)聽狀態(tài)下,如果客戶端向服務(wù)器發(fā)起連接請(qǐng)求,服務(wù)器通過調(diào)用accept()函數(shù)來接受該連

16、接請(qǐng)求。服務(wù)器與客戶端完成連接后,就可以進(jìn)行數(shù)據(jù)通信了。</p><p>  對(duì)客戶端來說,首先調(diào)用connect()函數(shù)向服務(wù)器發(fā)出連接請(qǐng)求。如果服務(wù)器接受了該請(qǐng)求,接下來就可以與服務(wù)器通信了。</p><p>  開發(fā)套接字應(yīng)用程序時(shí),首先應(yīng)進(jìn)行Windows Sockets的初始化,加載Windows Sockets的實(shí)現(xiàn),然后創(chuàng)建套接字,對(duì)TCP套接字來說,需要在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)聽—>接受連接—>收發(fā)數(shù)據(jù)—>關(guān)閉</p><p>  客戶

18、端:創(chuàng)建套接字—>連接—>收發(fā)數(shù)據(jù)—>關(guān)閉</p><p>  Windows Sockets API重要函數(shù)說明如下:</p><p>  一、WSAStartup()函數(shù):</p><p>  不管是客戶端還是服務(wù)器,開發(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)被用來保存函數(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)出能夠打開的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)度 來源:魁網(wǎng)學(xué)習(xí)頻道-計(jì)算機(jī)二級(jí)考試</p><p>  四、listen()函數(shù)</p><p>  listen()函數(shù)將套接字設(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:指定等待連接的最大隊(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)聽套接字</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表示無特殊行為,MSG_PEEK會(huì)使有用的數(shù)據(jù)被復(fù)制到接收緩沖區(qū)內(nèi),但沒有從系統(tǒng)緩沖區(qū)中將其刪除MSG_OOB表示處理帶外數(shù)據(jù)。 來源:魁網(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表示無特殊行為,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> ?。?)、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>  開始發(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() + " 開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ù)?器¡Â斷?開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("當(dāng)Ì¡À前¡ã與®?服¤t務(wù)?器¡Â斷?開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務(wù)?器¡Â!

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ū)嶒?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("無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>  通過兩個(gè)星期的實(shí)驗(yàn),是我更加深刻的了解了網(wǎng)絡(luò)編程是如何運(yùn)行實(shí)現(xiàn)的思想。更加深刻認(rèn)

125、知了所學(xué)網(wǎng)絡(luò)理論,通過編寫程序的方法形象具體的展示了網(wǎng)絡(luò)中是如何通訊的,icmp報(bào)文是如何定義,如何工作的。這個(gè)課設(shè)的完成,是我更加熟練的學(xué)習(xí)了在visual 2010</p><p>  環(huán)境先的編程,通過練習(xí)套接字編程,是我了解到了tcp/ip套接字是如何實(shí)現(xiàn)網(wǎng)絡(luò)通訊的,由開始的一無所知到現(xiàn)在的了解,我覺得是一個(gè)進(jìn)步。客戶端首先創(chuàng)建套接字,然后連接服務(wù)器,然后收發(fā)數(shù)據(jù),最后關(guān)閉;而服務(wù)器端,創(chuàng)建套接字綁定,監(jiān)

126、聽,接受連接,收發(fā)數(shù)據(jù),關(guān)閉。最后通過學(xué)習(xí),寫出了聊天室程序和ping程序,使得對(duì)網(wǎng)絡(luò)編程有所了解??傊@次課設(shè)有了很大的收獲。</p><p><b>  指導(dǎo)老師意見:</b></p><p>  成績(jī): 教師簽名: </p><p>  年

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論