




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告題 目: 基于Linux網(wǎng)絡(luò)聊天室的設(shè)計(jì) 姓 名: 陳佳悅 陳雄蘭 學(xué) 院: 信息科學(xué)技術(shù)學(xué)院 專 業(yè): 網(wǎng)絡(luò)工程 班 級(jí): 網(wǎng)絡(luò)工程102 學(xué) 號(hào): 19310213 19310214 指導(dǎo)教師: 薛 衛(wèi) 職稱: 副教授 基于Linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)摘要:本課程設(shè)計(jì)是在Linux環(huán)境下基于Socket進(jìn)行開(kāi)發(fā)的。系統(tǒng)服務(wù)器端和客戶端組成。服務(wù)端程序通過(guò)共享存儲(chǔ)區(qū)存儲(chǔ)聊天數(shù)據(jù),并發(fā)送給每個(gè)連接的客戶端。通過(guò)多路復(fù)用的子進(jìn)程實(shí)現(xiàn)服務(wù)端與多個(gè)客戶端之間的數(shù)據(jù)發(fā)送與接收??梢栽趩螜C(jī)上開(kāi)辟兩個(gè)窗口分別運(yùn)行客戶、服務(wù)器的程序。本方案經(jīng)gcc調(diào)試器調(diào)試成功,可以在機(jī)網(wǎng)絡(luò)聊天中使用。
2、關(guān)鍵詞:網(wǎng)絡(luò)聊天;linux ;socket 1相關(guān)概念及技術(shù)1.1 網(wǎng)絡(luò)套接字編程1.1.1套接字基本概念 套接字是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元??梢詫⑻捉幼挚醋鞑煌鳈C(jī)間的進(jìn)程進(jìn)行雙向通信的端點(diǎn),它構(gòu)成了單個(gè)主機(jī)內(nèi)及整個(gè)網(wǎng)絡(luò)間的編程界面。套接字存在于通信域中,通信域是為了處理一般的線程通過(guò)套接字通信而引進(jìn)的一種抽象概念。套接字通常和同一個(gè)域中的套接字交換數(shù)據(jù)(數(shù)據(jù)交換也可能穿越域的界限,但這時(shí)一定要執(zhí)行某種解釋程序)。各種進(jìn)程使用這個(gè)相同的域互相之間用Internet協(xié)議簇來(lái)進(jìn)行通信。 1.1.2 套接字工作原理 要通過(guò)互聯(lián)網(wǎng)進(jìn)行通信,你至少需要一對(duì)套接字,其
3、中一個(gè)運(yùn)行于客戶機(jī)端,我們稱之為ClientSocket,另一個(gè)運(yùn)行于服務(wù)器端,我們稱之為ServerSocket。 根據(jù)連接啟動(dòng)的方式以及本地套接字要連接的目標(biāo),套接字之間的連接過(guò)程可以分為三個(gè)步驟:服務(wù)器監(jiān)聽(tīng),客戶端請(qǐng)求,連接確認(rèn)。 所謂服務(wù)器監(jiān)聽(tīng),是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)。 所謂客戶端請(qǐng)求,是指由客戶端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求。 所謂連接確認(rèn),是指當(dāng)服務(wù)器端套接字監(jiān)聽(tīng)到或者說(shuō)
4、接收到客戶端套接字的連接請(qǐng)求,它就響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽(tīng)狀態(tài),繼續(xù)接收其他客戶端套接字的連接請(qǐng)求。 1.1.3 linux中socket的基本應(yīng)用:服務(wù)端建立套接字的大致步驟:(1)建立socket。(2)bindPort 綁定特定的端口。(3)listen 監(jiān)聽(tīng)特定的端口。(4)accept,當(dāng)有客戶端連接服務(wù)器端口時(shí),accept接收信息,并返回新的套接字描述符,提供給操作(5)根據(jù)實(shí)際需求,write,read,send,recv等操作(6)關(guān)閉套接字??蛻舳舜笾虏襟E
5、:1)創(chuàng)建socket.2)根據(jù)服務(wù)器地址,connect連接到特定服務(wù)器。3)write,read等讀寫(xiě)操作。4)關(guān)閉套接字。1.2 客戶/服務(wù)器模型應(yīng)用程序之間為了能順利地進(jìn)行通信,一方通常需要處于守候狀態(tài),等待另一方請(qǐng)求的到來(lái)。在分布式計(jì)算中,一個(gè)應(yīng)用程序被動(dòng)地等待,而另一個(gè)應(yīng)用程序通過(guò)請(qǐng)求啟動(dòng)通信的模式就是客戶服務(wù)器模式??蛻?服務(wù)器模型的典型運(yùn)行過(guò)程包括五個(gè)主要步驟:(1)服務(wù)器監(jiān)聽(tīng)相應(yīng)窗口的輸入。(2)客戶機(jī)發(fā)出請(qǐng)求。(3)服務(wù)器接收到此請(qǐng)求。(4)服務(wù)器處理此請(qǐng)求,并將結(jié)果返回給客戶機(jī)。(5)重復(fù)上述過(guò)程,直至完成一次會(huì)話過(guò)程任務(wù)。運(yùn)作過(guò)程如下: 請(qǐng)求Request 請(qǐng)求 圖 客
6、戶/服務(wù)器模型運(yùn)作過(guò)程 服務(wù)器 客戶機(jī) 進(jìn)程通信設(shè)備響應(yīng)響應(yīng)Request1.3 多路復(fù)用技術(shù)多路復(fù)用一般有以下幾種技術(shù):(1) 非阻塞通信技術(shù): 將文件管道設(shè)為非阻塞通信方式, 每隔一段時(shí)間對(duì)他們實(shí)行一次輪詢, 以判斷是否可以進(jìn)行讀寫(xiě)操作。(2)信號(hào)驅(qū)動(dòng)的異步I/O 技術(shù)。首先, 異步I/O 是基于信號(hào)機(jī)制的, 并不可靠。其次, 單一的信號(hào)不足以提供更多的信息來(lái)源。還是需要輔助以其他的手段, 實(shí)現(xiàn)有很高的難度。(3)select()技術(shù)。在BSD 中提供了一種可以對(duì)多路I/O 進(jìn)行阻塞式查詢的方法select()。它提供同時(shí)對(duì)多個(gè)I/O 描述符進(jìn)行阻塞式查詢的方法。(4) 子進(jìn)程技術(shù)。應(yīng)用多
7、個(gè)子進(jìn)程, 每一個(gè)對(duì)一個(gè)單工阻塞方式通信。所有子進(jìn)程通過(guò)IPC 和父進(jìn)程進(jìn)行通信。父進(jìn)程掌管所有信息。該聊天室即采用此種子進(jìn)程技術(shù)。1.4相關(guān)函數(shù)調(diào)用(1) Socket() 作用:socket函數(shù)為客戶機(jī)或服務(wù)器創(chuàng)建一個(gè)sokcet格式: int socket(int family,int type,int protocol); 參數(shù)說(shuō)明: Family:表示地址族,可以去AF_UNLX和AF_INT。其中,AF_UNLX只能夠用于單一的UNIX系統(tǒng)進(jìn)程間通信;AF_INT是針對(duì)Internet的,因而可以允許在遠(yuǎn)程主機(jī)之間通信,實(shí)驗(yàn)中使用AF_INT。 Type:網(wǎng)絡(luò)程序所采用的通信協(xié)議,
8、可以取SOCK_STREAM或SOCK_DGRAM。其中,SOCK_STREAM表明使用的是TCP協(xié)議,這樣提供按順序的、可靠的、雙向、面向連接的比特流;SOCKE_DGRAM表明使用的是UDP協(xié)議,這樣只會(huì)提供定長(zhǎng)、不可靠、無(wú)連接的通信。(2)bind( )格式:int bind(int sockfd,struct sockaddr *addr,int addrlen); 參數(shù)說(shuō)明: Sockfd:socket的文件描述符號(hào)。 Sockaddr:表示名字所用的一個(gè)數(shù)據(jù)結(jié)構(gòu),用來(lái)保存地址(包括IP地址和端口) Addrlen:設(shè)置結(jié)構(gòu)大小長(zhǎng)度。(3)listen()格式:int listen(
9、int sockfd, int backlog); 作用:監(jiān)聽(tīng)連接信號(hào),和accepted函數(shù)合同。 參數(shù)說(shuō)明: Sockfd:表示socket調(diào)用返回的文件描述符。 Backlog:表示接入隊(duì)列允許的連接數(shù)目,大多數(shù)系統(tǒng)允許20個(gè),也可以子定義510個(gè)。(4)accept() 格式:Int accept (int sockfd, void *addr, int *addrlen); 作用:與listen函數(shù)合用,監(jiān)聽(tīng)信息、接收客戶端請(qǐng)求。 參數(shù)說(shuō)明: Sockfd:表示socket的文件描述符。 Addr:表示指向局部的數(shù)據(jù)結(jié)構(gòu)struct sockaddr-in的指針。 Addrlen:表
10、示地址的長(zhǎng)度。(5)connect()格式: int connect( int sockfd , struct sockaddr *serv_addr , int addrlen); 作用:在面向連接的系統(tǒng)中客戶及連接服務(wù)器時(shí)使用,connect必須在bind后使用。 參數(shù)作用: Sockfd:表示socket的文件描述符。 Serv-addr:表示村訪目的端口和ip地址(套接字)的數(shù)據(jù)結(jié)構(gòu)。(6)send() 和 recv() 格式1:Int send (int sockfd, const vod *msg,int len, int flags); 功能:發(fā)送信息。 格式2:Int recv
11、 (int sockfd , void *buf,int len, usigned int flags); 作用:用于流式socket、數(shù)據(jù)報(bào)socket內(nèi)部之間的通信。(7)bindPort() 格式:int bindPort(unsigned short int port) 作用:創(chuàng)建套接字,并綁定到指定端口。參數(shù)說(shuō)明:指定所指定的端口號(hào)。(8)fork()作用:創(chuàng)建一個(gè)新的子進(jìn)程,而這個(gè)子進(jìn)程是父進(jìn)程的副本,接下來(lái)這兩個(gè)進(jìn)行就由操作系統(tǒng)調(diào)度,直到程序執(zhí)行結(jié)束。2.系統(tǒng)設(shè)計(jì)與功能分析2.1整體程序設(shè)計(jì): 服務(wù)端程序通過(guò)共享存儲(chǔ)區(qū)存儲(chǔ)聊天數(shù)據(jù),并發(fā)送給每個(gè)連接的客戶端;服務(wù)端程序和客戶端程序
12、都是通過(guò)父子進(jìn)程分別負(fù)責(zé)發(fā)送和接收數(shù)據(jù)的,以避免數(shù)據(jù)沖撞.2.1.1服務(wù)器端程序設(shè)計(jì):(1)建立服務(wù)器端,創(chuàng)建共享存儲(chǔ)區(qū),便于客戶與客戶之間的信息交流,及服務(wù)端的記錄。(2) 創(chuàng)建socket套接字 ,并綁定到指定端口,監(jiān)聽(tīng)套接字(客戶套接字)。(3) 在監(jiān)聽(tīng)過(guò)程中接受客戶端連接,并發(fā)送問(wèn)候信息。(4)接收到客戶端連接的信息后開(kāi)始創(chuàng)建子進(jìn)程,其中父進(jìn)程用于接受信息,子進(jìn)程用于發(fā)送信息,實(shí)現(xiàn)多線程操作。2.1.2客戶端程序設(shè)計(jì):(1) 建立一個(gè)客戶端的socket套接字,綁定客戶端套接字連接服務(wù)端。(2) 連接成功后,創(chuàng)建子進(jìn)程,其中父進(jìn)程用于接受信息,子進(jìn)程用于發(fā)送信息。 (3) 創(chuàng)建子進(jìn)程成
13、功后,可以進(jìn)行客戶端與客戶端的通信聊天。2.2 系統(tǒng)功能:(1)創(chuàng)建服務(wù)器后,服務(wù)器創(chuàng)建了共享存儲(chǔ)區(qū),方便客戶與客戶之間聊天信息的記錄,包括聊天具體內(nèi)容及時(shí)間記錄。(2)客戶端創(chuàng)建后如xx(需輸入ip地址、端口號(hào)、用戶名 如下面截圖實(shí)例:./c 127.0.0.1 6666 xx),在服務(wù)器的監(jiān)聽(tīng)下,很快xx就與服務(wù)器建立了連接。(3)與此同時(shí)另一客戶yy創(chuàng)建,同理yy也與服務(wù)器建立了連接,此時(shí)兩客戶端就可以通過(guò)服務(wù)器建立連接,開(kāi)始聊天。(4)在服務(wù)器上,也一直記錄了客戶端間的聊天記錄具體信息。3.主要算法及流程圖 圖5為客戶端主程序的流程圖; 圖6為客戶端get()函數(shù)即文件下載的流程圖;
14、圖7為服務(wù)器端出程序流程圖;4.系統(tǒng)開(kāi)發(fā)調(diào)試與運(yùn)行環(huán)境Ø 開(kāi)發(fā)環(huán)境:本系統(tǒng)是在Linux環(huán)境下用C語(yǔ)言結(jié)合網(wǎng)絡(luò)編程知識(shí)開(kāi)發(fā)的。 Ø 運(yùn)行環(huán)境:l 虛擬機(jī):Vmwarel 操作系統(tǒng):Ubuntu-11.10-desktop5.實(shí)驗(yàn)運(yùn)行效果截圖演示:第一部分:(1) 服務(wù)器端:編譯s.c即服務(wù)器端程序,運(yùn)行,顯示如下:說(shuō)明連接成功,服務(wù)器正在監(jiān)聽(tīng),有無(wú)客戶端請(qǐng)求。(2)客戶端1:編譯c.c即客戶端程序,運(yùn)行指定IP地址為本機(jī)地址,端口號(hào)為6666,用戶名為xx,顯示如下:說(shuō)明已經(jīng)進(jìn)入群聊的聊天室。(2) 客戶端2:編譯c.c即客戶端程序,運(yùn)行指定IP地址為本機(jī)地址,端口號(hào)為66
15、66,用戶名為yy,顯示如下:說(shuō)明已經(jīng)進(jìn)入群聊的聊天室。第二部分:(1) 客戶端1:開(kāi)啟聊天功能,xx在界面上發(fā)起對(duì)話(2) 客戶端2:當(dāng)xx在自己的客戶端1界面上發(fā)起對(duì)話,客戶端2界面顯示內(nèi)容,同時(shí)yy也向xx即客戶端1發(fā)送內(nèi)容。(3) 服務(wù)器端:服務(wù)器接收客戶端1(xx)發(fā)送的內(nèi)容并且傳送給客戶端2(yy),同時(shí)接收yy發(fā)送的內(nèi)容再轉(zhuǎn)發(fā)給xx。第三部分:聊天截圖雖然實(shí)現(xiàn)的只是一個(gè)功能相對(duì)比較簡(jiǎn)單的程序,但是期間受益匪淺,一方面是考察了這一個(gè)學(xué)期來(lái)對(duì)linux內(nèi)核編程的學(xué)習(xí)成果,檢驗(yàn)了綜合運(yùn)用所學(xué)知識(shí)點(diǎn)的能力,嘗試將書(shū)本的理論知識(shí)運(yùn)用到實(shí)踐中,另一方面在實(shí)踐中加深了對(duì)理論知識(shí)的理解,發(fā)現(xiàn)理論
16、到實(shí)際所出現(xiàn)的問(wèn)題、困難,以及尋找解決的方案,與此同時(shí)能夠讓我們認(rèn)清自己在學(xué)習(xí)Socket編程不足之處和薄弱環(huán)節(jié),并加以彌補(bǔ)和鞏固,并且通過(guò)對(duì)線程同步程序的設(shè)計(jì)和運(yùn)用,進(jìn)一步的鞏固用Socket編程的能力,并且也更好的理解操作系統(tǒng)的工作形式。第一次采用采用C/S架構(gòu)并且在linux環(huán)境下編寫(xiě)程序,比較新鮮但是期間我們也遇到了很多的困難,例如: (1)socket實(shí)現(xiàn)過(guò)程:服務(wù)器端的recv()函數(shù),不同情況下,返回的次數(shù)不清楚,其實(shí)是對(duì)返回的條件不清楚,后來(lái)經(jīng)過(guò)查閱資料以及對(duì)事例的研究,基本清楚了它的運(yùn)用。 (2)在實(shí)現(xiàn)多線程的時(shí)候,調(diào)用pthread_exit()函數(shù)使線程退出。需要注意的地方:一是,主線程中如果從main函數(shù)返回或是調(diào)用了exit函數(shù)退出主線程,則整個(gè)進(jìn)程終止,此時(shí)所有的其他線程也將終止。另一種是,如果主線程調(diào)用pthread_exit函數(shù),則僅僅是主線程消亡,進(jìn)程不會(huì)結(jié)束,其他線程也不會(huì)結(jié)束,知道所有的線程都結(jié)束時(shí),進(jìn)程才結(jié)束。剛開(kāi)始接觸的時(shí)候只是對(duì)上課的時(shí)候老師給的例子基本分析了解,但是實(shí)現(xiàn)的時(shí)候一直無(wú)法實(shí)現(xiàn)多線程,即并發(fā)執(zhí)行。 從編程中體會(huì)頗多,學(xué)到了很多東西,懂得了怎樣建立socket套接字,在客戶端和在服務(wù)器端的不同之處,TCP套接字以及加鎖解鎖和條件變量的作用。也懂得了網(wǎng)絡(luò)通信中服務(wù)器需要循環(huán)等待客戶
溫馨提示
- 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國(guó)山楂行業(yè)發(fā)展分析及發(fā)展前景與趨勢(shì)預(yù)測(cè)研究報(bào)告
- 2025-2030中國(guó)小吃店行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030中國(guó)壽險(xiǎn)行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030中國(guó)對(duì)外工程承包行業(yè)市場(chǎng)現(xiàn)狀供需分析及市場(chǎng)深度研究發(fā)展前景及規(guī)劃可行性分析研究報(bào)告
- 2025-2030中國(guó)家用水過(guò)濾裝置行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030中國(guó)寵物營(yíng)養(yǎng)品行業(yè)發(fā)展分析及投資風(fēng)險(xiǎn)預(yù)測(cè)研究報(bào)告
- 2025-2030中國(guó)嬰幼兒折疊床行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及發(fā)展趨勢(shì)與投資研究報(bào)告
- 2025-2030中國(guó)嬰兒護(hù)理產(chǎn)品行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030中國(guó)天線行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略研究報(bào)告
- 2025-2030中國(guó)大型輪胎平衡機(jī)行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及競(jìng)爭(zhēng)策略與投資發(fā)展前景研究報(bào)告
- 宜家營(yíng)商環(huán)境分析報(bào)告
- 工傷預(yù)防教育培訓(xùn)課件
- 2024年高等教育法學(xué)類自考-00227公司法歷年考試高頻考點(diǎn)試題附帶答案
- 電梯故障維修報(bào)告書(shū)
- 朊病毒感染的護(hù)理查房課件
- (完整文本版)河南2016定額計(jì)算規(guī)則
- 考研有機(jī)化學(xué)復(fù)習(xí)題
- 小升初個(gè)人簡(jiǎn)歷模板下載
- 出差審批單 差旅費(fèi)報(bào)銷單
- 鋼梁現(xiàn)場(chǎng)安裝檢驗(yàn)批質(zhì)量檢驗(yàn)記錄
- 醫(yī)療廢物信息化管理平臺(tái)系統(tǒng)介紹
評(píng)論
0/150
提交評(píng)論