TCP聊天系統(tǒng)大作業(yè)_第1頁
TCP聊天系統(tǒng)大作業(yè)_第2頁
TCP聊天系統(tǒng)大作業(yè)_第3頁
TCP聊天系統(tǒng)大作業(yè)_第4頁
TCP聊天系統(tǒng)大作業(yè)_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1 編 號2 2期 末 大 作 業(yè)題目: 基于 tcp/udp 的聊天室系統(tǒng)物聯(lián)網(wǎng)工程學(xué) 院計(jì)算機(jī)科學(xué)與技術(shù)專 業(yè)學(xué)號0304100222 學(xué)生姓名仲其龍指導(dǎo)教師楊路二一三 年五月摘要2 摘 要課題是基于 tcp/udp 協(xié)議編寫聊天室系統(tǒng)。聊天室系統(tǒng)主要包括注冊、登陸、群聊、單聊、顯示在線人員和退出功能。系統(tǒng)主要包括客戶端、服務(wù)器端和客戶顯示端。其中客戶端與服務(wù)器端的連接基于tcp 協(xié)議,服務(wù)器端向客戶顯示端發(fā)送數(shù)據(jù)是基于udp 協(xié)議。課題是網(wǎng)絡(luò)協(xié)議棧中傳輸層的應(yīng)用,在網(wǎng)絡(luò)成的基礎(chǔ)上,在傳輸層中使用網(wǎng)絡(luò)套接字,達(dá)到數(shù)據(jù)傳送的目的,從而實(shí)現(xiàn)聊天室系統(tǒng)功能。關(guān)鍵詞: tcp/udp;聊天室;網(wǎng)絡(luò)

2、套接字;數(shù)據(jù)傳送目錄3 目錄摘 要 . 2 目錄. 3 1 原理 . 4 1.1tcp . 4 1.2udp . 4 1.3 流程圖 . 5 2 關(guān)鍵代碼 . 6 3 實(shí)驗(yàn)結(jié)果 . 11 4 小結(jié) . 13tcp/ip 協(xié)議與網(wǎng)絡(luò)編程期末大作業(yè)4 1 原理1.1 tcp 在面向連接的數(shù)據(jù)流( sock_stream)傳輸過程中,設(shè)計(jì)基于tcp/ip 協(xié)議的程序是傳輸層使用 tcp 協(xié)議,它的最大的特點(diǎn)是在通信之前要在客戶和服務(wù)器之間先建立連接,在數(shù)據(jù)傳輸完成后要關(guān)閉連接,釋放網(wǎng)絡(luò)資源。面向連接的客戶 /服務(wù)器程序工作模型如下:wsastartup()accept()listen()bind()

3、socket()wsastartup()socket()connect()等待客戶連接請求用三次握手建立連接recv()send()交換數(shù)據(jù)send()closesocket()closesocket()wsaclenaup()wsaclenaup()recv()關(guān)閉 tcp連接面向連接的客戶/ 服務(wù)器程序工作模型1.2 udp 無連接的數(shù)據(jù)報(bào)( sock_dgram )傳輸服務(wù)在傳輸層使用的協(xié)議時(shí)udp 協(xié)議。與面向連接的通信協(xié)議過程不同,它的最大的特點(diǎn)就是必須要在客戶和服務(wù)器之間建立連接,通信的任何一方可以先發(fā)送數(shù)據(jù),這樣首先發(fā)送數(shù)據(jù)的一方就成為客戶端,而接收數(shù)據(jù)的一方就是服務(wù)器端。在數(shù)據(jù)

4、傳輸完畢后,只要關(guān)閉套接口,釋放網(wǎng)絡(luò)資源,通信過程就結(jié)束了。無連接的數(shù)據(jù)包傳輸服務(wù)通信是,客戶端與服務(wù)器端所使用的函數(shù)是類似的。面向無連接的客戶 /服務(wù)器程序工作模型如下:tcp/ip 協(xié)議與網(wǎng)絡(luò)編程期末大作業(yè)5 wsastartup()bind()socket()recvfrom()sendto()closesocket()wsastarup()wsastartup()bind()socket()recvfrom()sendto()closesocket()wsastarup()交換數(shù)據(jù)交換數(shù)據(jù)無連接的客戶/ 服務(wù)器程序工作模型1.3 流程圖基于 tcp/udp 的聊天室系統(tǒng)包括客戶端、 客

5、戶顯示端和服務(wù)器端三部分。功能主要是注冊、 登陸、群聊、單聊、顯示在線人員和退出??蛻舳伺c服務(wù)器端的連接協(xié)議基于tcp 協(xié)議,服務(wù)器端發(fā)送功能基于udp 協(xié)議??蛻舳伺c服務(wù)器端建立連接后,客戶端進(jìn)行操作,將數(shù)據(jù)發(fā)送至客戶顯示端??蛻舳私⑦B接注冊登錄單聊群聊顯示在線退出程序客戶端建立建立連接處理注冊處理登錄退出程序處理單聊處理群聊處理顯示在線數(shù)據(jù)傳輸客戶顯示端建立顯示連接信息顯示注冊信息顯示登錄信息顯示單聊顯示群聊顯示在線退出程序數(shù)據(jù)傳遞程序流程圖tcp/ip 協(xié)議與網(wǎng)絡(luò)編程期末大作業(yè)6 2 關(guān)鍵代碼client:/ 建立套接字,建立連接if( wsastartup( makeword ( 2

6、,2),&wsadata)!=0)cerr failed to load winsock. endl;return0; sclient = socket( af_inet , sock_stream ,0);if( sclient = invalid_socket)cerr socket() failed: wsagetlasterror() endl;return0; ser. sin_family = af_inet; ser. sin_port = htons( iport); ser. sin_addr. s_addr = inet_addr( server_ip );/服務(wù)器

7、 ip / conection the server if( connect( sclient,( sockaddr*)& ser ,sizeof( ser )=- 1)cerr ! 無法連接 endl;return0;elsecout ! 連接成功 endl; / 用戶注冊cout ! 您將進(jìn)行注冊 endl;cout name ;cout password;if( name =| password = )cout ! 無效輸入 endl;break;sendstr = ;sendstr =sendstr + 1+ + name + #+ password + $+ ipaddres

8、sstr tcp/ip 協(xié)議與網(wǎng)絡(luò)編程期末大作業(yè)7 +*+ msg + 0;/ message to be sent isend =send ( sclient, sendstr. c_str(), sendstr. size(),0);/ 用戶登錄cout ! 您將進(jìn)行登陸n name ;cout password;sendstr = ;sendstr = sendstr + 2+ + name + #+ password + $+ ipaddressstr + *+ msg +0;/ message to be sent isend =send ( sclient, sendstr. c_

9、str(), sendstr. size(),0);/ 群聊while( true)cout name msg ;if( msg =:home| msg =:home )break;sendstr = ;sendstr = sendstr + 3+ + name + #+ password +$+ ipaddressstr +*+ msg + 0;/ message to be sent isend =send ( sclient, sendstr. c_str(), sendstr. size(),0);/ 顯示在線人數(shù)sendstr = ;sendstr = sendstr + 5+ +

10、name + #+ password + $+ ipaddressstr +*+ msg + 0;/ message to be sent isend =send ( sclient, sendstr. c_str(), sendstr. size(),0);cout numperson;while( true)cout name msg ;if( msg =:home| msg =:home )break;sendstr = ;sendstr =sendstr + 6+ + name + #+ password +tcp/ip 協(xié)議與網(wǎng)絡(luò)編程期末大作業(yè)8 $+ ipaddressstr +

11、*+ numperson + msg +0;isend =send ( sclient, sendstr. c_str(), sendstr. size(),0);/ 顯示在線人數(shù)sendstr = ;sendstr = sendstr +5+ name +#+ password +$+ ipaddressstr + *+ msg + 0;/ message to be sent isend =send ( sclient, sendstr. c_str(), sendstr. size(),0);server: / 創(chuàng)建監(jiān)聽套接字,監(jiān)聽事件if( wsastartup( makeword (

12、 2,2),&wsadata)!=0) cerr wsastartup failed wsagetlasterror() endl;return0;/ 創(chuàng)建流式套接字 ssocket = socket( af_inet , sock_stream ,0); c1 =socket( af_inet , sock_dgram , 0);if( ssocket = invalid_socket | c1 = invalid_socket) cerr socket() failed wsagetlasterror() endl;return0;/ 將套接口 s置于 ” 非阻塞模式 ser. s

13、in_family =af_inet ; ser. sin_port =htons( iport); ser. sin_addr. s_addr =inet_addr( server_ip );if( bind( ssocket,( sockaddr*)& ser ,sizeof( ser )= socket_error) cerr bind() failed wsagetlasterror() endl;return0;/ 進(jìn)入監(jiān)聽狀態(tài)if( listen( ssocket,5)= socket_error ) cerr listen failed wsagetlasterror()

14、 endl;return0;/ 創(chuàng)建事件對象 newevent = wsacreateevent();tcp/ip 協(xié)議與網(wǎng)絡(luò)編程期末大作業(yè)9 if( newevent = wsa_invalid_event) cerr wsacreateevent() failed wsagetlasterror() endl;return0;/ 網(wǎng)絡(luò)事件注冊int weserror = wsaeventselect( ssocket, newevent, fd_accept | fd_close );if( weserror = invalid_socket) cerr wsaeventselect()

15、failed wsagetlasterror() endl;return0;/ 等待事件對象int nindex = wsawaitformultipleevents( n, eventarray, false , wsa_infinite, false ); / 網(wǎng)絡(luò)事件查詢wsaenumnetworkevents( sockarray nindex - wsa_wait_event_0,null,&event);wsaresetevent( eventarray nindex - wsa_wait_event_0);if( event. lnetworkevents & f

16、d_accept )!=0)/ 處理 fd_accept通知消息if( event. ierrorcode fd_accept_bit =0)snew = accept( sockarray nindex - wsa_wait_event_0,( struct sockaddr*)& cli,&ilen);cout 【:ip: inet_ntoa( cli. sin_addr) 連接成功】 endl;/ 處理注冊if( mnamelogout. count( namestr)=1)/ existed ipaddress cout 【 namestr : ip: ipadress

17、 用戶名已經(jīng)注冊】 endl;else/ not existed cout 【 namestr :ip: ipadress 注冊成功】 endl; int isend =sendto( c1 ,sendstr. c_str(),sendstr. size(),0,( sockaddr *)& cli,sizeof( cli);/ 處理登陸if( mnamelogout. count( namestr)=1)tcp/ip 協(xié)議與網(wǎng)絡(luò)編程期末大作業(yè)10 / existed ipaddress if( mnamesocket. count( namestr)=1) cout 【 namest

18、r : ip: ipadress 登陸成功】 endl;elseif( mpwlogout namestr= passwordstr)cout 【 namestr : ip: ipadress 登陸成功】 endl;else cout 【 namestr : ip: ipadress 密碼錯(cuò)誤】 endl;else/ not existed cout 【 namestr :ip: ipadress 尚未注冊】 endl; / 處理群發(fā)if( mnamesocket. count( namestr)=1)cout 【 namestr :ip: ipadress : msg 】 endl; els

19、ecout 【 namestr :ip: ipadress 尚未登陸】 endl;for( map:iterator it = mnamesocket. begin();it !=mnamesocket. end ();+ it)/ 群發(fā)信息int isend = sendto( c1 , sendstr. c_str(), sendstr. size(),0,( sockaddr *)& cli2,sizeof( cli2);elseif( recvstr 0=4)/ 處理退出if( mnamesocket. count( namestr)=1)cout 【 namestr :ip: ipadress 斷開連接】endl;tcp/ip 協(xié)議與網(wǎng)絡(luò)編程期末大作業(yè)11 mnamesocket. erase( namestr); / 單發(fā)信息int isend =sendto( c1 , sendstr. c_str(), sendstr. size(),0,( sockaddr *)& cli,sizeof( cli); / 處理非法斷開連接if( event. ierrorcode fd_close_bit = 10053 )for( map:iterator it =mnamesocket. begin();it !=mnamesocket. end ()

溫馨提示

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

評論

0/150

提交評論