網(wǎng)絡(luò)協(xié)議編程課程設(shè)計.doc_第1頁
網(wǎng)絡(luò)協(xié)議編程課程設(shè)計.doc_第2頁
網(wǎng)絡(luò)協(xié)議編程課程設(shè)計.doc_第3頁
網(wǎng)絡(luò)協(xié)議編程課程設(shè)計.doc_第4頁
網(wǎng)絡(luò)協(xié)議編程課程設(shè)計.doc_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

HUNAN CITY UNIVERSITY 網(wǎng)絡(luò)協(xié)議編程課程設(shè)計說明書 設(shè)計題目: 基于多線程的網(wǎng)絡(luò)聊天控制臺軟件的設(shè)計與實現(xiàn) 專 業(yè): 網(wǎng) 絡(luò) 工 程 學(xué)生姓名: 朱江 班級學(xué)號: 1206102-21 分組成員:1206102-06郭輝超1206102-18曾濤1206102-21朱江 指導(dǎo)教師: 黃雪華老師 汪彥老師 2015 年 07月 03日網(wǎng)絡(luò)協(xié)議編程課程設(shè)計報告學(xué)號:1206102-21 姓名:朱江一、設(shè)計時間2015年06月29日-07月03日。二、設(shè)計地點湖南城市學(xué)院信息樓507機房。三、設(shè)計目的1、鞏固網(wǎng)絡(luò)協(xié)議編程課程涉及的基本知識,培養(yǎng)靈活運用知識進行獨立設(shè)計的能力;2、掌握TCP/IP網(wǎng)絡(luò)程序框架、Winsock API、高級網(wǎng)絡(luò)編程API的使用;3、提高綜合運用所學(xué)的理論知識獨立分析和解決問題的能力;4、進一步熟悉利用Visual C+6.0進行開發(fā)的能力;5、培養(yǎng)查閱資料,獨立思考問題的能力。四、設(shè)計小組成員1206102-06 郭輝超,1206102-18 曾濤,1206102-21 朱江。五、指導(dǎo)老師黃雪華老師、汪彥老師。六、設(shè)計課題經(jīng)過小組大部分組員的討論,決定選取選題(基于多線程的網(wǎng)絡(luò)聊天控制臺軟件的設(shè)計與實現(xiàn)),編寫一個基于局域網(wǎng)的多線程控制臺聊天系統(tǒng)。理由:1、此系統(tǒng)要求采用C/S模式實現(xiàn),有利于進一步深刻理解和掌握這種基本的網(wǎng)絡(luò)編程模式。2、該系統(tǒng)功能相對簡單,易于實現(xiàn),適于初學(xué)者。3、該系統(tǒng)牽涉到Winsock編程,需要靈活運用這些知識解決實際問題,有利于培養(yǎng)網(wǎng)絡(luò)系統(tǒng)開發(fā)的實際動手能力。七、基本思路及關(guān)鍵問題的解決方法設(shè)計思路 對于聊天程序,一般都是采用 C/S 模式,即服務(wù)器/客戶端的模式來設(shè)計。這樣的模式有利于用戶的操作和更好的用戶體念。而客戶端的設(shè)計主要關(guān)注與用戶的體念和操作方便,其網(wǎng)絡(luò)設(shè)計比較簡單;服務(wù)器則要完成大量的客戶控制、數(shù)據(jù)轉(zhuǎn)發(fā)等操作,設(shè)計起來相對更加復(fù)雜??傮w設(shè)計 聊天程序是一個典型的網(wǎng)絡(luò)程序,而網(wǎng)絡(luò)程序的設(shè)計大多 是基于 TCP/IP協(xié)議來實現(xiàn)的, TCP/IP協(xié)議是一個4層協(xié)議族,如圖1所示。 聊天程序主要是依賴于傳輸層來實現(xiàn),在傳輸層中有兩個重要的協(xié)議:TCP協(xié)議和UDP協(xié)議。其中TCP協(xié)議(傳輸控制協(xié)議)是一個面向連接的協(xié)議,本協(xié)議在進行網(wǎng)絡(luò)傳輸過程中首先必須建立一個安全的連接(通常是采用3次握手來實現(xiàn)的),UDP(用戶數(shù)據(jù)報協(xié)議)是一種無連接的協(xié)議,本協(xié)議在進行數(shù)據(jù)傳輸前不用建立點對點的連接,所傳輸?shù)臄?shù)據(jù)不會進行安全檢查,如果有丟包的現(xiàn)象也不會重發(fā),本文所涉及的聊天程序采用TCP 協(xié)議來實現(xiàn)由于每個電腦可能會有多個服務(wù),而每個服務(wù)都采用同一個IP地址來進行收發(fā)數(shù)據(jù),所以就必須采用一種機制來實現(xiàn)對每個服務(wù)的區(qū)分這就是端口,對于同一IP地址的不同端口號就代表了不同的服務(wù),所以對于網(wǎng)絡(luò)聊天程序的服務(wù)器端必須設(shè)定一個端口號,而客戶端則必須連接到服務(wù)器端的IP和其指定的端口,如圖2所示。 在本文的聊天程序中,采用客戶端發(fā)送數(shù)據(jù)-服務(wù)器接收數(shù)據(jù)-服務(wù)器轉(zhuǎn)發(fā)數(shù)據(jù)-客戶端接收數(shù)據(jù)的流程來完成。由于該程序是一個服務(wù)器和多個客戶端進行聊天的,所以在這里就必須注意以下幾個問題: 服務(wù)器需要監(jiān)控端口,以便客戶的隨時連接;服務(wù)器需要監(jiān)控數(shù)據(jù)流,以便隨時接受來自客戶端發(fā)來的數(shù)據(jù);為了實現(xiàn)客戶點對點的聊天, 則將為每個客戶建立一個線程。服務(wù)器設(shè)計 服務(wù)器設(shè)計主要難點是對多線程的設(shè)計, 在這里主要涉及 到三方面的內(nèi)容:一是對客戶端接入的監(jiān)控,需要一個線程來完成;二是分別為每個客戶端創(chuàng)建一個線程,用于收發(fā)數(shù)據(jù),使客戶端之間不會彼此干擾;三是每個客戶端產(chǎn)生的線程對數(shù)據(jù)輸入流進行監(jiān)控,隨時準(zhǔn)備接收數(shù)據(jù)。對于數(shù)據(jù)則應(yīng)該采用數(shù)據(jù)包的形式來進行封裝,分別由發(fā)送者的地址,接收者的地址和數(shù)據(jù)構(gòu)成,其中地址由昵稱、IP和端口構(gòu)成。當(dāng)服務(wù)器接收到該數(shù)據(jù)后,將這些數(shù)據(jù)向每個客戶端都發(fā)送出去,由客戶端來決定是否接收該數(shù)據(jù)。所示:另外,當(dāng)客戶端連接到服務(wù)器時,將向服務(wù)器發(fā)送一個數(shù)據(jù)包,服務(wù)器從數(shù)據(jù)包里面提取出客戶端的地址信息和昵稱,并且根據(jù)這些信息生成一張地址信息和昵稱的對照表,且將這張表群發(fā)給每個客戶;當(dāng)有客戶退出連接時,服務(wù)器則從對照表中將該客戶的信息刪除,并且群發(fā)該表給所有客戶,該表的形式如下:地址昵稱 127.0.0.1 朱江 客戶端設(shè)計對于客戶端的設(shè)計則比服務(wù)器簡單得多,主要是從界面等方便用戶操作的角度來考慮??蛻舳酥饕枰瓿蛇B接服務(wù)器、數(shù)據(jù)收發(fā)等功能。對于數(shù)據(jù)收發(fā)功能主要通過數(shù)據(jù)流來實 現(xiàn)。8、 算法及流程圖9、 調(diào)試過程中出現(xiàn)的問題及相應(yīng)解決辦法1.一開始在客戶端與服務(wù)器進行通信時,只有服務(wù)器能看見客戶端的消息,而客戶端看不見服務(wù)器發(fā)的消息,之后我們發(fā)現(xiàn)這是因為在客戶端接受消息的代碼少了,在補全之后,雙方都能接收信息。2.之后我們想給這個段代碼多添加一些其他的功能,首先添加時間,在此過程中我們一開始準(zhǔn)備使用CTime t=CTime.getCurrentTime();這個方法,可是除了一些我們沒能解決問題,后來經(jīng)過詢問老師和查詢資料,最終我們使用了源程序中的獲取時間的代碼。10、 課程設(shè)計心得體會 課程設(shè)計是培養(yǎng)學(xué)生綜合運用所學(xué)知識,發(fā)現(xiàn),提出,分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié),是對學(xué)生實際工作能力的具體訓(xùn)練和考察過程,通過實驗學(xué)習(xí)和領(lǐng)悟,充分的熟悉了VC+的運用和操作,并順利完成實驗,增強自身團隊協(xié)作意識。11、 源程序客戶端#include stdafx.h#include #include #pragma comment(lib,WS2_32.lib)#include #include SOCKET sockclient;sockaddr_in sockaddrclient;char sendbuf100;char tempbuf100;char recvbuf100;int len=sizeof(SOCKADDR_IN);DWORD WINAPI SendProc( LPVOID lpParameter / thread data);void main() /* *1.加載套接字,創(chuàng)建套接字(WSAStartup(),socket())* */ time_t tt = time(NULL);/這句返回的只是一個時間cuo tm* t= localtime(&tt); WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 2 | HIBYTE( wsaData.wVersion ) != 2 ) WSACleanup( ); return; sockclient=socket(AF_INET,SOCK_DGRAM,0); /*2.向服務(wù)器發(fā)送數(shù)據(jù)(sendto)。*/ sockaddrclient.sin_addr.S_un.S_addr=inet_addr(127.0.0.1); sockaddrclient.sin_family=AF_INET; sockaddrclient.sin_port=htons(6000); / HANDLE Hsend=CreateThread(NULL,0,SendProc,NULL,0,NULL); CloseHandle(Hsend); while(1) recvfrom(sockclient,recvbuf,100,0,(sockaddr*)&sockaddrclient,&len); if(*recvbuf) sprintf(tempbuf,%s:%s,inet_ntoa(sockaddrclient.sin_addr),recvbuf); printf(%d-%02d-%02d %02d:%02d:%02d, t-tm_year + 1900, t-tm_mon + 1,t-tm_mday,t-tm_hour,t-tm_min,t-tm_sec); printf( ); printf(%sn,tempbuf); /* /3.關(guān)閉套接字。inet_ntoa() */DWORD WINAPI SendProc( LPVOID lpParameter / thread data) while(1) gets(sendbuf); sendto(sockclient,sendbuf,100,0,(sockaddr*)&sockaddrclient,len); return 0;服務(wù)器#include stdafx.h#include #include #pragma comment(lib,WS2_32.lib)#include sockaddr_in sock;char recvbuf100;char sendbuf100;char tempbuf100;int len=sizeof(sockaddr);sockaddr_in SockAddr;SOCKET ServerSock;DWORD WINAPI SendProc( LPVOID lpParameter / thread data);void main() /* *1.加載套接字,創(chuàng)建套接字(WSAStartup(),socket())* */ time_t tt = time(NULL);/這句返回的只是一個時間cuo tm* t= localtime(&tt); WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 2 | HIBYTE( wsaData.wVersion ) != 2 ) WSACleanup( ); return; ServerSock=socket(AF_INET,SOCK_DGRAM, IPPROTO_UDP); /* *2.將套接字綁定到一個本地地址和端口上(bind())。 */ SockAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); SockAddr.sin_family=AF_INET; SockAddr.sin_port=htons(6000);/ SockAddr.sin_zero= bind(ServerSock,(sockaddr*)&SockAddr,sizeof(sockaddr_in); /* *3.等待接收數(shù)據(jù)(recvfrom)。 */ HANDLE Hsend=CreateThread(NULL,0,SendProc,NULL,0,NULL); CloseHandle(Hsend); while(1) recvfrom(ServerSock,recvbuf,100,0,(sockaddr*)&sock,&len); if(*recvbuf) sprintf(tempbuf,%s:%s,inet_ntoa(sock.sin_addr),recvbuf); printf(%d-%02d-%02d %02d:%02d:%02d, t-tm_year + 1900, t-tm_mon + 1,t-tm_mday,t-tm_hour,t-tm_min,t-tm_sec); printf( ); printf(%sn,tempbuf); DWORD WINAPI SendProc( LPVOID lpParameter

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論