基于Linux操作系統(tǒng)的聊天軟件的設(shè)計畢業(yè)設(shè)計說明書_第1頁
基于Linux操作系統(tǒng)的聊天軟件的設(shè)計畢業(yè)設(shè)計說明書_第2頁
基于Linux操作系統(tǒng)的聊天軟件的設(shè)計畢業(yè)設(shè)計說明書_第3頁
基于Linux操作系統(tǒng)的聊天軟件的設(shè)計畢業(yè)設(shè)計說明書_第4頁
基于Linux操作系統(tǒng)的聊天軟件的設(shè)計畢業(yè)設(shè)計說明書_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 2014屆畢業(yè)設(shè)計說明書 基于linux操作系統(tǒng)的聊天軟件的設(shè)計 學 院: 電氣與信息工程學院 學生姓名: 指導教師: 職稱 講師 專 業(yè): 電子信息工程 班 級: 電子1002班 完成時間: 2014年5月 摘 要 這篇論文整體是在linux下并通過網(wǎng)絡實現(xiàn)類似于qq的的一篇操作報告。開發(fā)的框是c/s框架,由server端和client端組成,首先設(shè)置好端口參數(shù)和ip地址,在編譯,調(diào)試后實現(xiàn)server端與各個client端的連接,連接后以后server端作為中間端來使客戶機實現(xiàn)通訊,因為服務器只存在一個但是客戶端存在多個所以我們必須通過鏈表去管理,client端的信息發(fā)送通過封裝在soc

2、ket結(jié)構(gòu)體中進行傳輸。本設(shè)計采用tcp/ip協(xié)議這樣可以保證連接可靠,而且項目管理中釆用linux流行的gcc和makefile編譯,大大提高了編譯和調(diào)試效率,提高了項目完成的效率,但是為了模擬幾個client端我們就需要在pc機上再安裝一個虛擬系統(tǒng)來操作client端。本次設(shè)計的聊天通信使用全雙工,主要實現(xiàn)了功能如:用戶的帳號與密碼的注冊與登錄,客戶點對點聊天,客戶之間的群聊,以及文件的發(fā)送與接收。測試運行后的可靠性滿足linux網(wǎng)絡聊天的基本要求。關(guān)鍵詞:linux, socket, ,server端,client端,網(wǎng)絡編程 abstract this thesis as a whol

3、e is under linux platform and through the local area network to achieve similar qq chat. the overall use of c / s framework, the main server -side and client into two parts , set ip and port number , and linux, compile and debug procedures to achieve client and server connections each client side ,

4、and then as the server -side following transfer to achieve communication between client end . since only one server -side , and you can have multiple client end , so the server side using a single list to manage multiple client side information , client side encapsulated for transmission of informat

5、ion sent through the body in the socket structure . this design uses the tcp / ip protocol ,so you can ensure reliable connection, but also preclude the use of project management in a popular linux gcc and makefile to compile, compile and debug greatly improved efficiency , improve the efficiency of

6、 the completion of the project, but due to simulate multiple client end therefore, in the operating environment need to install a virtual system on the pc to operate multiple client side . the chat tool designed for full-duplex communication using communication , to achieve the five main functions:

7、to-peer chat between new user registration and login, user , group chat among users , file encryption transmission between users. after running the test program to meet the basic needs of network reliability in linux in chat .keywords : linux, socket, server -side , client end , network programming

8、目 錄 1 緒 論11.1 課題研究的背景及意義11.2 tcp/ip介紹21.3 本文的研究內(nèi)容42 技術(shù)說明與方案選擇52.1通信方式52.1.1 udp通信52.1.2 tcp通信52.2客戶/服務器模型62.3網(wǎng)絡套接字(socket)的概念72.4多線程的概念72.5i/o多路復用83 系統(tǒng)實現(xiàn)113.1 linux提供的有關(guān)socket的系統(tǒng)調(diào)用113.2 實驗過程說明(使用tcp/ip)133.3 tcp通信實現(xiàn)144 運行效果29結(jié)束語34致謝35參考文獻36附錄a 服務器程序38附錄b 客戶端程序47 1 緒 論 1.1 課題研究的背景及意義隨著計算機應用技術(shù)的日益普及,網(wǎng)絡

9、也遍及到我們生活的每個角落,很好的利用這一資源,將成為我們工作和學習,帶來極大的方便。并且可以極高的提高我們的工作效率。所以,各種聊天軟件應運而生了。如國外的msn等,國內(nèi)主要的有騰訊的qq,還有ticq和一些在網(wǎng)頁上的即時通訊工具,像chinaren網(wǎng)站上的webmaster等等,都做得即美觀又強大,騰訊的qq有非常大的用戶群。這些網(wǎng)絡聊天軟件極大程度上方便了處于在世界各地的友人之間的聯(lián)系,無論你和親人、朋友相隔多遠,你都可以隨時隨地和他們交流。并且,你還可以和外國友人交流學習。在網(wǎng)絡發(fā)展上,最早出現(xiàn)的是分布在很大的地理范圍內(nèi)的遠程網(wǎng)絡(wideareanetwork,wan),例如美國國防

10、部高級研究計劃局首先研制的 arpa 網(wǎng),它從 1969 年建立,至今已經(jīng)發(fā)展成為跨越幾大洲的巨型網(wǎng)絡。70 年代中期由于微型計算機的出現(xiàn)和微處理器的出現(xiàn),以及短程通訊技術(shù)的迅猛發(fā)展,兩者相輔相成,又促進以微機為基礎(chǔ)的各種局域網(wǎng)絡(local area network,lan)的飛快發(fā)展,1975 年美國 xerox 公司首先推出了 ethernet,與此時英國劍橋大學研制成劍橋環(huán)網(wǎng),他們是 lan 的代表。lan 與 wan 有所區(qū)別,其特點為:1)有限的地理范圍,通常網(wǎng)內(nèi)的計算機限于一棟大樓,樓群或一個企業(yè)及單位。2)較高的通訊速率,大多在每秒 1-100m bps ,而 wan 大多在幾

11、十 kbps。3)通訊介質(zhì)多樣。4)通常為一個部門所擁有。特別是 80 年代以來,以微機為基礎(chǔ),lan 技術(shù)有了極其迅速的發(fā)展。90 年代計算機網(wǎng)絡化大趨勢尤為明顯。具稱 1978 年全世界約有 700 萬人每天使用計算機,而到 1998 年上升到 5000 萬人,目前全世界已經(jīng)擁有超過一億臺的計算機,預計每天上機人數(shù)可達 2 億以上。計算機的性能價格比以每年 25%的速度在提高。微機的應用已經(jīng)滲透到國民經(jīng)濟的各個部門,乃至家庭和個人。這標志著正步入信息時代,世界范圍內(nèi)的社會信息數(shù)據(jù)正在每年增長 40%到 45%的年增長率在增加,這就是迫切實現(xiàn)網(wǎng)絡化的動力源泉。據(jù)稱,約有 65%的計算機要聯(lián)網(wǎng)

12、或已經(jīng)聯(lián)網(wǎng),以求彼此通信,達到資源共享的目標。90 年代計算機網(wǎng)絡化更加向深度和廣度方向發(fā)展。人們要求網(wǎng)絡傳輸?shù)膬?nèi)容范圍增加,諸如數(shù)據(jù)之外,還需傳輸聲音,圖形,圖象和文字,這就是以網(wǎng)絡為基礎(chǔ)的多媒體技術(shù),使網(wǎng)絡的應用廣度更加擴大,并最終為信息化社會的實現(xiàn)所必須的網(wǎng)絡連接奠定基礎(chǔ)。當前國際 lan 的市場上,兩雄稱霸,龍爭虎斗的局面,將可能持續(xù)相當長一段時間。正如大家知道的那樣,80 年代后期美國 novell 公司先是以“一花獨秀,壓倒群芳”之勢占據(jù)了國際 lan 市場 60%以上,一路領(lǐng)先,扶搖直上,尤其是 netware 386 v3.11 版推出后,受到普遍的注目;隨后,國際上的軟件公司

13、龍頭老大 microsoft 公司先后推出了lan manager v1.0(即 lan 3+ open)、lan manager v2.0 和 v2.1,后來居上,成為世界lan 的兩大支柱之一。1992 年 10 月 microsoft 又搶先發(fā)布了 lan managerv2.2,以更加領(lǐng)先于 novell 的 netware 386 v3.11,但后者立即隨后推出了 netware 4.0。可見“龍爭虎斗”,瓜分市場的情景。novel lan 采取了“將網(wǎng)絡協(xié)議軟件與網(wǎng)絡操作系統(tǒng) netware 緊密結(jié)合起來”的設(shè)計構(gòu)想,可達到節(jié)省開銷,提高運行效率之目標。novell lan 最大的

14、特點是與其底層的網(wǎng)卡的無關(guān)性,即是說 netware 可以虛擬的在所有流行的 lan 上面運行,使它成為一個理想的開發(fā)網(wǎng)絡應用軟件的平臺,吸引了廣大用戶軟件人員為之開發(fā)越來越多的網(wǎng)絡應用軟件。反過來又推動其發(fā)展,同時 novell lan 采取了開放協(xié)議技術(shù)(opt),允許各種網(wǎng)絡協(xié)議緊密結(jié)合,進而在 netware 386 v3.11 版中采用了 nlm 模塊的組合技術(shù),可以實現(xiàn)異機種聯(lián)網(wǎng)的難題。此外,novell lan 不需專用服務器,占用工作站內(nèi)存最小,使用方便,功能強,效率高,兼容性強,可靠性高,保密性強,容錯性好。尤其在 netware 386 v3.11版中實現(xiàn)了服務器軟件的“分

15、布式結(jié)構(gòu)策略”、“橫向信息共享”、“報文傳送”技術(shù)、增添了“tcp/ip ?!薄崿F(xiàn)了“sna 協(xié)議”和“開放式數(shù)據(jù)鏈路接口”等一系列新技術(shù),使 novelllan 更深入人心,擴大了市場。與此同時,微軟的lan manager v2.1和v2.2局域網(wǎng)版除了有一般的基礎(chǔ)的優(yōu)點,還應用了“客戶機服務器”(client/server)的強大內(nèi)網(wǎng)絡體系結(jié)構(gòu),以及基于多用戶,多任務并發(fā)先進的 os/2 作為服務器,并以 os/2,unix, vms 和 windows nt 作為系統(tǒng)的開發(fā)平臺,更方便與異類機種訪問網(wǎng)絡。由于 lan manager與 windows 的聯(lián)系;使它有更高的的性格比。在

16、網(wǎng)絡化技術(shù)飛速發(fā)展的今天,tcp/ip 協(xié)議可謂是立下了汗馬功勞。起先,tcp/ip(transmission control protocol/internet protocol)是由美國國防部于 70 年代提出來的,將中大型機連成的網(wǎng)絡互連起來,并按 tcp/ip 協(xié)議這種模式實現(xiàn)異網(wǎng)之間通訊,接著美國國防部高級計劃局(darpa)于 70 年代末提出了幾種國際互連(internet)技術(shù)。這些技術(shù)實現(xiàn)了在科學研究,軍事和社會生活迫切需要共享的資料。題1.2 tcp/ip介紹transmission control protocol/internet protocol的簡寫,中譯名為傳輸控

17、制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又名網(wǎng)絡通訊協(xié)議,是internet最基本的協(xié)議,internet國際互聯(lián)網(wǎng)絡的基礎(chǔ),由網(wǎng)絡層的ip協(xié)議和傳輸層的tcp協(xié)議組成。tcp/ip 定義了電子設(shè)備如何連入因特網(wǎng),以及數(shù)據(jù)如何在它們之間傳輸?shù)臉藴?。協(xié)議采用了4層的層級結(jié)構(gòu),每一層都呼叫它的下一層所提供的協(xié)議來完成自己的需求。通俗而言:tcp負責發(fā)現(xiàn)傳輸?shù)膯栴},一有問題就發(fā)出信號,要求重新傳輸,直到所有數(shù)據(jù)安全正確地傳輸?shù)侥康牡?。而ip是給因特網(wǎng)的每一臺電腦規(guī)定一個地址。(1) 協(xié)議優(yōu)勢在社會長期的發(fā)展過程中,ip逐步取代了其余的網(wǎng)絡。這是一個簡單的解釋。ip傳輸通用數(shù)據(jù)。數(shù)據(jù)能夠用于任何目的,并且能夠很輕易地

18、取代以前由專有數(shù)據(jù)網(wǎng)絡傳輸?shù)臄?shù)據(jù)。(2)協(xié)議的缺點第一,協(xié)議在服務,接口方面的區(qū)分不明確。好的軟件工程在功能與實現(xiàn)上面是有明確的區(qū)分的,tcp/ip沒有很好地做到這點。第二,主機-網(wǎng)絡層本身并不是實際的一層,它定義了網(wǎng)絡層與數(shù)據(jù)鏈路層的接口。1.3 linux介紹 linux是一種開源的操作系統(tǒng),它擁有像windows和mac那樣的功能齊全的ui界面(gui,graphical user interface)。linus torvald。作為一種很棒的操作系統(tǒng),它具有與unix,mac,windows和windows nt相似的的功能,但是其中又會有不同的地方。 提到linux我們一定要知道g

19、nu和unix。richard m.stallman創(chuàng)建的自由軟件聯(lián)盟推出了兩種許可證,gnu是通用公共許可證(gnu gneral public license,gpl)和gnu函數(shù)庫通用公共許可證(gnu library gneral public license,lgpl)。除了一些庫是以gnu函數(shù)庫通用公共許可證發(fā)行的,其他基本上gnu工程的軟件和文檔是以gnu通用公共許可證為基礎(chǔ)發(fā)布的。按照gnu的相關(guān)規(guī)定,linux的源代碼可以在網(wǎng)上免費自由獲取,這一點為我們學習者提供了極大的方便。gpl極大的體現(xiàn)了stallman的思想:只要用戶所做的修改是有利于系統(tǒng)發(fā)展的,用戶可以自由地使用、

20、拷貝、查詢、重用、修改也可以發(fā)布這個修改后的軟件。就這樣gpl保證了linux的優(yōu)點不僅現(xiàn)在自由可用,而且經(jīng)過修改后的系統(tǒng)都仍然可以自由使用。 unix是由att貝爾實驗室的ken thompson和dennis ritchie在已經(jīng)廢棄了的pdp-7上開發(fā)的在1969年;剛開始它是一個僅用用匯編語言單編寫的一個建議的單用戶用戶操作系統(tǒng)。后來,又在pdp-11上用c語言重新編寫系統(tǒng),把unix做成為了一個文本處理系統(tǒng),這樣極大的促進了unix在貝爾實驗室得的使用。unix的最初版本不收費的供應給眾多的大學的計算機系去使用。加州大學伯克利分校的計算機系就是在這眾多的大學中,并對unix進行了完善

21、并且增加了許多新的特點,這就是被廣大的開發(fā)者所熟知的的bsc版本的unix。在這個事間的同時,很多其他的的unix版本也開始萌生。unix不斷發(fā)展壯大,許多版本被應用到不同類型的的計算機使用。而linux最初就是專門為intel的個人計算機設(shè)計的。(1)linux的昨天 1991年,一名叫l(wèi)inus torvalds的芬蘭大學生覺得unix各種版本對于一個類型的機器的兼容性比較差(80386類的機器),于是他決定要開發(fā)出一個全功能的、并且支持posix標準的、類似于unix的操作系統(tǒng)的系統(tǒng)內(nèi)核,該系統(tǒng)取得了bsd和system v 的精華,同進去除了它們的糟粕。他將內(nèi)核開發(fā)到了0.02版,這個

22、版本中已經(jīng)可以運行g(shù)cc、bash和其他少量的應用程序。后來他在英特網(wǎng)的幫助下在在1994年將linux升級到1.0版本。它的源代碼量也呈指數(shù)形式迅速增長,實現(xiàn)了基本的tcp/ip功能,在此同時大約有100000用戶開始使用linux操作系統(tǒng)了,linux系統(tǒng)開始被廣大的用戶所認可。(2) linux的今天 作為服務器級的操作系統(tǒng),在廣大的開發(fā)者的共同努力下linux操作系統(tǒng)已經(jīng)非常成熟了?,F(xiàn)在的linux內(nèi)核集成了150萬多行代碼,不僅可以作為web服務器平臺,而且也為越來越多的用戶提供文件和打印服務。它既被當作郵件服務器的一種候選平臺,也被當作一種強壯而安全的防火墻。 linux的企業(yè)級特

23、性:linux系統(tǒng)不僅支持多處理器、支持大型文件系統(tǒng)、日志文件系統(tǒng)而且在密集型計算和高可用性集群技術(shù)上面也逐步成熟。 現(xiàn)在的linux的ui界面也在繼續(xù)完善。kde桌面提供的圖形用戶界面在易用性和可配置方面和微軟的windows不相上下。(3) linux的明天 linux最強大的生命力在于其開源。每學習者都有可以輕松自由的獲取內(nèi)核源代碼,每個人都可以運載源程序并對其加以修改,而后的他人也可以自由獲取你修改后的源程序。集市模型就是為linux這種獨特的自由流暢的開發(fā)模型已被命名。集市模型是通過重視實驗征集和充分利用早期的反饋,通過平衡的配置腦力資源,從而開發(fā)出更優(yōu)秀的軟件。 1.4 本文的研究

24、內(nèi)容本課題的任務是設(shè)計一個支持多人群聊以及用戶間私聊和文件傳送的聊天系統(tǒng)。首先服務器會初始化,然后等待客戶端的連接。每連接一個客戶端就簡歷一個線程去監(jiān)聽客戶端請求。客戶端是注冊好了的,只需要登陸??蛻舳俗猿晒芽蛻舳诵畔⒈4娴芥湵砗臀募?。注銷時會把對應的鏈表節(jié)點銷毀,并且刪除文件對應信息。當有多個客戶端登陸時,客戶端界面會顯示其他用戶的用戶名。可以實現(xiàn)用鍵選擇,然后按回車鍵進入與其的私聊界面。然后可以和其進行私聊和文件傳送。而好友界面的倒數(shù)第二個為群聊選擇,當進入群聊時,可以實現(xiàn)多人同時聊天。另外,如果其他人下線時。你的顯示好友界面里的那個客戶端就會消失,同時,有人上線時,會在好友欄加上

25、新加的客戶端。最后一個選項是退出,銷毀對應線程及文件描述符。 2 技術(shù)說明與方案選擇 2.1 通信方式2.1.1 udp通信 udp是用戶數(shù)據(jù)報協(xié)議的簡稱。udp在傳送數(shù)據(jù)之前不需要先建立連接,遠地主機的傳輸層在收到udp數(shù)據(jù)后,不能給出任何確認信息,所以不能保證其交付時信息的可靠性。它的特點是:無連接,不能提供的可靠的信道,但正是因為無連接這個特點使udp具有很好的傳輸效率。2.1.2 tcp通信 tcp是傳輸控制協(xié)議的簡稱,tcp可以提供一條全雙工的、可靠的信道。tcp在數(shù)據(jù)傳送之前必須先建立相應的連接,數(shù)據(jù)傳送完成后必須釋放連接。但是tcp不能提供廣播和多播這些信息服務。 正是因為tcp

26、要提供可靠的、面向連接的運輸?shù)榷鄻拥姆?,所以增加了額外的系統(tǒng)開銷,例如確認、流量的控制、計時器以及連接管理等服務都需要消耗許多系統(tǒng)資源。 如果計算機之間使用通信方式是tcp通信,則計算機之間的連接過程需要三次握手實現(xiàn),如下圖1-1所示。 圖1-1 用三次握手建立tcp連接 對于計算機連接的釋放過程也需要類似的3次握手的互相確認的過程,如實驗圖1-2所示。 圖1-2 tcp連接的釋放過程通過以上兩種方案的比較,考慮適用性,本次課題我選擇了選擇tcp通信協(xié)議。2.2 c/s模型c/s模型將應用程序分為server端和client端兩基本的部分,client端對server端發(fā)送請求,server

27、端對其作出相應的回應并開始提供服務。在tcp/ip應用中,多數(shù)網(wǎng)絡應用程序是使用c/s模型設(shè)計的。server端一直處于等待狀態(tài),當一個client端提出請求時。server端馬上會根據(jù)client端發(fā)送的請求從而執(zhí)行對應操作以至于達到server端的要求。通常,c/s模型必須包含兩個獨立的應用程序:client端和server端的應用程序。在c/s模型中,多個在同樣的內(nèi)網(wǎng)中的計算機都作為client端,與端口號和ip進行連接,并通過server端傳遞信息。所以client端的通信既可以理解為client端和server端之間的通信。所以采用c/s模型進行網(wǎng)絡聊天系統(tǒng)的設(shè)計需要分別編寫clie

28、nt端和server端的源代碼,client端和server端之間相互通信的程序流程如實驗圖1-3所示。 圖1-3 socket通信流程圖2.3 網(wǎng)絡套接字(socket)的概念socket接口是tcp/ip的api,它提供了相應的功能函數(shù)與例程,我們可以使用對應的函數(shù)與例程進行tcp/ip應用程序的開發(fā)與維護。使用socket套接字進行網(wǎng)絡通信的開發(fā)過程如下面的步驟:(1) 建立一個socket套接字(2) 按我們所需要的要求配置好socket套接字,將socket連接到遠程server端或者是本機server端或給socket套接字指定本地協(xié)議端口號。(3) 按要求通過socket套接字發(fā)

29、送和接受相應的數(shù)據(jù)與信息。(4) 完成通信以后我們需要關(guān)閉此socket套接字并且釋放相應的其他銷耗系統(tǒng)的操作。以上就是通過socket套接字來實現(xiàn)點對點信息通信的4個編程的核心要點。2.4 系統(tǒng)的選擇方案一:紅帽子系統(tǒng)即red ha系統(tǒng)是目前銷售量最高、安裝最簡便、最適合初學者的linux發(fā)行版,也是目前世界上最流行的linux發(fā)行套件,它的市場營銷、包裝及服務做的相當不錯,自行開發(fā)了rpm套件管理程序及x桌面環(huán)境gnome的眾多軟件并將其源代碼回饋給open source community。也正是因為red hat的方便性,安裝程序?qū)⑾到y(tǒng)的構(gòu)架或軟件安裝方式全部做了包裝,用戶學到的都是g

30、ui界面(圖形用戶界面)上輸入一些設(shè)置值的粗淺知識,至于軟件安裝了那些文件、安裝到哪個文件目錄、系統(tǒng)作了哪些設(shè)置,使用者則一無所知,一旦真正遇到系統(tǒng)程序發(fā)生問題時,要解決問題也就比較困難。方案二:caldera openlinux系統(tǒng),caldera將openlinux這套系統(tǒng)定位為容易使用與設(shè)置的發(fā)行版,以集成使用環(huán)境與最終用戶辦公環(huán)境,容易安裝使用與簡便管理為系統(tǒng)目標,有望成為最流行的公司團體臺式linux操作系統(tǒng),適合初學者使用,全部安裝需要1gb的硬盤空間。caldera有自行研發(fā)的圖形界面的安裝程序向?qū)?,安裝過程可以玩俄羅斯方塊,提供完整的kde桌面環(huán)境,附贈功能強大的商業(yè)軟件,如s

31、taroffice、圖形界面的硬盤分割工具partition magic等。方案三:suse linux系統(tǒng),suse是歐洲最流行的linux發(fā)行版,而且suse是軟件國際化的先驅(qū),讓軟件支持各國語系,貢獻頗豐,suse也是用rpm作為軟件安裝管理程序,不過suse并不適合新手使用,提供了非常多的工具軟件,全部安裝需4.5gb的硬盤空間,安裝過程也較為復雜。通過以上三種方案的比較,考慮適用性,和可操作性,選擇red hat linux 操作系統(tǒng)。2.5 開發(fā)工具的選擇方案一:vi編輯器,vi編輯器是linux上最基本的文本編輯器,它是以字符模式為核心的。由于去除了ui界面,使vi編輯器效率提高

32、了很多。在linux上也有許多ui界面的編輯器,但vi在系統(tǒng)和服務器管理中的相應的功能是ui編輯器不可以達到的。vi編輯器在linux上的重要性是與edit在dos上的地位是一樣。vi編輯器可以執(zhí)行文字輸出、文字刪除、文字查找、文字替換、文件塊操作等眾多文本操作,用戶也可以根據(jù)自身的需要對其進行相應的定制和二次開發(fā),這是其他編輯程序所不能達到的效果。加上紅帽子系統(tǒng)中自帶的gcc編譯器和gdb調(diào)試工具,所以linux系統(tǒng)目前最主流的開發(fā)工具。方案二:用eclipse 加cdt+gcc+gdb,雖然eclipse 擁有方便的ui界面,配置開發(fā)環(huán)境有點復雜,如果配置好了,開發(fā)的效率還是不錯的。和在w

33、indows下開發(fā)基本相似。用eclipse+cdt可以自動生成makefile文件,比較適合偏愛圖形界面的開發(fā)人員。通過以上兩種方案的比較,考慮適用性,和編程習慣,選擇方案一。 2.6 多線程與多進程點對點通信的實現(xiàn)知識,了解了主機進程與服務器進程之間的連接關(guān)系,建立連接了一對一的進程聯(lián)系,即主機的一個進程必須與服務器的一個進程之間建立相應的連接。而對于每一個client端服務器都要建立一個相應的進程去實現(xiàn)和client端的通信。 對于線程的并發(fā)情況我們就要建立多個線程去出來。由于服務端接受信息的行為是被動的,當服務端沒有信息可以接收時,該進程就應該自動的阻塞,發(fā)送任務也應該一起被阻塞。不同

34、端口的收發(fā)之間就存在并發(fā)情況,這樣我們就應該應該建立多個不同的進程去分別完成信息的收發(fā)。這樣,當一個client端的請求被阻塞時,不至于影響其它的client端的正常工作。關(guān)于多進程和多線程,我覺得最核心的一句話是“進程是資源分配的最小單位,線程是cpu調(diào)度的最小單位”。方案一:多進程,數(shù)據(jù)共享非常復雜,需要用ipc處理;數(shù)據(jù)是分開處理的,同步比較簡單;但是內(nèi)存耗的多,切換相應的會比較復雜,cpu利用率低創(chuàng)建銷毀、切換復雜,速度慢;編程簡單,調(diào)試簡單;適應于多核、多機分布式;如果一臺機器不夠,擴展到多臺機器比較簡單。方案二:多線程,他的優(yōu)點在于共享進程間的數(shù)據(jù),數(shù)據(jù)共享就變的十分的簡單,并且創(chuàng)

35、建銷毀、切換簡單,速度很快,缺點也由于這個原因?qū)е峦綇碗s;雖然占用內(nèi)存少,切換簡單,但是cpu利用率高,編程復雜,調(diào)試復雜;一個線程死掉將導致整個進程失去功能,。通過以上兩種方案的比較,考慮適用性,選擇多線程實現(xiàn)對客戶端的監(jiān)聽。2.7 i/o多路復用除了可以采用多進程和多線程方法去實現(xiàn)并發(fā)情況之外,還可以采用i/o多路復用這門技術(shù)來實現(xiàn)。通過該技術(shù),系統(tǒng)內(nèi)核首先會緩沖i/o數(shù)據(jù),當某個i/o準備好后,系統(tǒng)自動通知相應的應用程序去完成i/o讀或?qū)懖僮鳎@樣應用程序可以迅速的完成對應的i/o操作,因而系統(tǒng)不需要等待完成相應i/o操作,從而應用程序設(shè)置阻塞。因此我在收發(fā)信息方面使用了i/o多路復用

36、去處理,即在處理群聊私聊的信息傳送時。對于client端,一旦我們輸入了一行文字發(fā),系統(tǒng)會自動的讀取,進而發(fā)送給系統(tǒng)內(nèi)的server端,然后由server端反饋給對應的目標client端。方案一:當我們使用的poll函數(shù)返回時,會返回一個文件是讀寫標志,應用程序根據(jù)不同的返回標志去讀寫相應的文件,實現(xiàn)不用阻塞就可以完成讀寫。這允許進程來決定那個client端是可讀或?qū)懸粋€或多個文件而不用阻塞的。poll返回不同的標志,這些標志告訴主進程文件是否可以讀寫,其原型(定義在 ):unsigned int (*poll) (struct file *filp, poll_table *wait);實現(xiàn)

37、這個設(shè)備的方法分為下面的兩步:1. 在一個或多個可指示查詢狀態(tài)變化的等待隊列上調(diào)用 poll_wait. 當文件描述符不可以可用來執(zhí)行 i/o時, 內(nèi)核將使這個進程在處于等待狀態(tài),一旦又來可使用的文件描述符時,. 驅(qū)動自動的通過調(diào)用函數(shù) poll_wait增加一個新的等待隊列到 poll_table結(jié)構(gòu),原型:void poll_wait (struct file *, wait_queue_head_t *, poll_table *);2. 返回一個位掩碼:我們在處理某一些功能時不必要阻塞,需要立刻進行的操作,那么我們就需要下面的幾個標志(通過 定義)用來指示可能的操作,如表2-1所示:標

38、志 含義 pollin 如果設(shè)備無阻塞的讀,就返回該值 pollrdnorm 通常的數(shù)據(jù)已經(jīng)準備好,可以讀了,就返回該值。通常的做法是會返回(polllin|pollrdnora) pollrdband 如果可 以從設(shè)備讀出帶外數(shù)據(jù),就返回該值,它只可在linux內(nèi) 核的某些網(wǎng)絡代碼中使用,通常不用在設(shè)備驅(qū)動程序中 pollpri 如果可 以無阻塞的讀取高優(yōu)先級(帶外)數(shù)據(jù),就返回該值,返回該值會導致select報告文件發(fā)生異常,以為select八帶外數(shù)據(jù)當作異常處理 pollhup 當讀設(shè) 備的進程到達文件尾時,驅(qū)動程序必須返回該值,依照select的功能描述,調(diào)用select的進程被告知進

39、程時可讀的。 pollerr 如果設(shè) 備發(fā)生錯誤,就返回該值。 pollout 如果設(shè)備可以無阻塞地些,就返回該值 pollwrnorm 設(shè)備已經(jīng)準備好,可以寫了,就返回該值。通常地做法是(pollout|pollnorm) pollwrband 于pollrdband類似表2-1 poll函數(shù)返回的位掩碼及其含義 方案二:select函數(shù):select()函數(shù)的接口主要以fd_set類型為基礎(chǔ)而建立的。fd_set)是一組文件描述符(fd)的大集合。由于在不同的平臺上fd_set類型的長度是不同的,因此規(guī)定用一組標準的宏定義來處理此類變量顯得尤其重要: fd_set set;fd_zero(

40、&set); fd_set(fd, &set); fd_clr(fd, &set); fd_isset(fd, &set); 在過去,一個fd_set通常是小于32個文件描述符的,因為fd_set其實僅僅使用了一個int的比特矢量來實現(xiàn)它。在大多數(shù)情況下系統(tǒng)的責任之一包括檢查 fd_set能包括任意值的文件描述符,但是當我們知道我們的文件描述符的多少時你應該檢查/修改宏fd_setsize的值。這個值是與系統(tǒng)相關(guān)的,同時我們也要檢查linux系統(tǒng)中的自帶的select() 的man手冊。因為有一些系統(tǒng)對多于1024個文件描述符的fd_set是存在支持的問題的。譯者注: linux就是這樣的系統(tǒng)

41、!你會發(fā)現(xiàn)sizeof(fd_set)的結(jié)果是128(*8 = fd_setsize=1024) 盡管很少你會遇到這種情況。select的基本接口其實是非常的簡單的:int select(int nfds, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout); 其中: nfds 需要檢查的文件描述符個數(shù),數(shù)值應該比是三組fd_set中最大數(shù) 更大,而不是實際文件描述符的總數(shù)。readset 用來檢查可讀性的一組文件描述符。writeset 用來檢查可寫性的一組文件描述符。exceptset

42、 用來檢查意外狀態(tài)的文件描述符。(注:錯誤并不是意外狀態(tài))timeout null指針代表一直等待,否則是指向timeval結(jié)構(gòu)的指針,代表最 長等待時間。(如果其中tv_sec和tv_usec都等于0, 則文件描述符 的狀態(tài)不被影響,但函數(shù)并不掛起) 函數(shù)將返回響應操作的總的響應了的描述符,且三組數(shù)據(jù)均在恰當位置被修改,只有響應操作的那一些沒有修改。接著應該用fd_isset宏來查找返回的文件描述符組。通過以上兩種方案的比較,考慮適用性,選擇調(diào)用poll函數(shù)實現(xiàn)i/o多路復用。 3 系統(tǒng)實現(xiàn) 3.1 linux提供的有關(guān)socket的系統(tǒng)調(diào)用(1) socket() 作用:socket函數(shù)為

43、client端或server端創(chuàng)建一個sokcet套接字格式:int socket(int family,int type,int protocol); 參數(shù)說明: family:表示地址族(ip地址),可以去af_unlx和af_int。其中,af_unlx只能夠用于unix系統(tǒng)進程間通信;af_int是可以用于internet的,因而可以允許在遠程主機之間通信,實驗中使用af_int。 type:網(wǎng)絡程序所采用的通信協(xié)議,可以取sock_stream或sock_dgram。其中,sock_stream表明使用的是tcp協(xié)議,;socke_dgram表明使用的是udp協(xié)議。(2) bind(

44、 )格式: int bind(int sockfd,struct sockaddr *addr,int addrlen); 參數(shù)說明: sockfd:socket套接字的的文件描述符。 sockaddr:ip地址和端口 addrlen:設(shè)置結(jié)構(gòu)大小長度。(3) listen()格式: int listen(int sockfd, int backlog); 作用:監(jiān)聽。 參數(shù)說明: sockfd:表示調(diào)用返回的文件描述符。 backlog:表示接入隊列允許的連接數(shù)目。(4) accept()格式:int accept (int sockfd, void *addr, int *addrlen)

45、; 作用:與listen函數(shù)合用,監(jiān)聽信息、接收client端請求。 參數(shù)說明:sockfd:表示socket的文件描述符。addr:表示指向局部的數(shù)據(jù)結(jié)構(gòu)struct sockaddr-in的指針。addrlen:表示地址的長度。(5) connect()格式: int connect( int sockfd , struct sockaddr *serv_addr , int addrlen); 作用:在面向連接的系統(tǒng)中client端連接server端時使用,connect必須在bind后使用。 參數(shù)作用: sockfd:表示socket的文件描述符。serv-addr:表示村訪目的端口和

46、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 (int sockfd , void *buf,int len, usigned int flags); 作用:用于流式socket、數(shù)據(jù)報socket內(nèi)部之間的通信。close() 和 shutdown()格式:close( int sockfd) 或int shutdown(int sockfd , int how);參數(shù)說明:how的值為下面一種: 0-不

47、允許繼續(xù)接收; 1-不允許繼續(xù)發(fā)送; 2-不允許繼續(xù)發(fā)送和接收。(7) 有關(guān)線程的系統(tǒng)調(diào)用函數(shù)pthread_create()、pthread_detach()3.2 實驗過程說明(使用tcp/ip)(1) 監(jiān)聽連接 利用socket、bind、listen建立連接,步驟是:1) 先用socket函數(shù)初始化socket,創(chuàng)建新的sockfd。sockfd = socket(af_int,sock_stream,0)2) 此步驟涉及到ip地址及其處理過程。參數(shù)說明:inet_addr 函數(shù) inaddr_any該函數(shù)把由小數(shù)點分開的十進制ip地址轉(zhuǎn)為unsinged long 類型,而在實驗中所

48、使用的為inaddr_any,使用利用自已的ip地址自動填充。a) 利用bind函數(shù)綁定端口和ip地址。my_addr.sin_family=af_inet; /*將地址族類型設(shè)定好 */my_addr.sin_port=htons(myport); /* 將端口給其賦值*/my_addr.sin_addr.s_addr=inaddr_any; /*用連接地址自動填充ip*/bind(sockfd,(stuct sockaddr*)&my_addr,sizeof(stuct sockaddr);/*sockfd 是分配的socket名字,my-addr則便是分配好的端口與ip,用bind綁定*

49、/b) 利用listen監(jiān)聽請求 (2) 發(fā)送請求 1)先用socket函數(shù)初始化socket,創(chuàng)建新的sockfd。 2)初始化要連接的服務器地址。 3)利用connect函數(shù)將自己的ip地址等信息發(fā)送到主機,等待主機調(diào)用accept函數(shù)來接受請求。(3) 主機接收請求,進行數(shù)據(jù)通信1)主機利用accept接收請求。2)創(chuàng)建子進程,顯示歡迎信息;3)接收返回信息,顯示連接成功,并退出連接;4)關(guān)閉客戶端口socket;3.3系統(tǒng)方案說明 linux下的聊天軟件涉及的一個server端和多個client端.client端向server端發(fā)送請求,server端對請求作出響應.client端嘗試

50、與server端建立連接.一旦連接建立起來,client端和server端就可以通過socket套節(jié)字進行通信.本系統(tǒng)中,主要有兩個應用程序,分別為server端程序和client端,client端主要是用于消息轉(zhuǎn)發(fā)、客戶登陸信息的管理以及向所有用戶發(fā)送系統(tǒng)消息等。本系統(tǒng)采用c/s(client/server)體系結(jié)構(gòu)(見圖3-1),即client端/server端體系結(jié)構(gòu).其特點是client端只裝載應用軟件,消息處理、用戶監(jiān)控等復雜的處理放在server端中實現(xiàn),這樣就可以大大簡化client端的代碼,增加了系統(tǒng)的穩(wěn)定性。 圖3-1 c/s體系結(jié)構(gòu)圖其大致實現(xiàn)模型是:(1)server端設(shè)

51、置一個固定的端口號.一旦server端啟動,既使用listenthread線程對端口進行不間斷監(jiān)聽.如果client端請求一個連接,server端使用accept()方法打開一個socket連接.(2)客戶在host和port端口建立連接.(3)server端和client端使用inputstream和outputstream進行通信.3.4結(jié)構(gòu)流程3.4.1. server端結(jié)構(gòu)流程圖server端通過socket()系統(tǒng)調(diào)用創(chuàng)建一個socket數(shù)組后(即設(shè)定了接受連接客戶的最大數(shù)目),與指定的本地端口綁定bind(),就可以在端口進行l(wèi)isten().如果有client端連接請求,則在數(shù)組

52、中選擇一個空socket,將client端地址賦給這個socket.然后登錄成功的客戶就可以在server端上聊天了。 圖3-2 server端結(jié)構(gòu)流程圖 3.4.2客戶端結(jié)構(gòu)流程圖客戶通過socket套接字建立與server端的連接。server端與客戶都通過調(diào)用recv()和send()來實現(xiàn)相互的通信,然后雙方通過該通信方式來相互傳遞信息,一旦收到客戶方的連接請求,server端accept()方法返回一個新建的socket對象??蛻舳巳缓笙騭erver端發(fā)送消息,比如聊天等,server端收到來自客戶的請求后,針對不同的消息處理請求。 圖3-3 客戶端結(jié)構(gòu)流程圖 3.4.3登錄結(jié)構(gòu)流程

53、圖用戶登錄,首先要有一個提供用戶登錄的存儲方式。用戶登錄的表單應該嵌入整體的結(jié)構(gòu)當中。在實際的應用中,可以這樣設(shè)計,如果用戶沒有登錄,則在頁面中顯示用戶登錄的選項,用戶登錄后,則可隱藏用戶登錄的界面,并且顯示登陸成功后的其他信息。首先,用戶要自己輸入用戶名和密碼。網(wǎng)絡聊天需要很高的穩(wěn)定性和安全性,因此對用戶名不允許重復使用。同時對密碼也要求保密,將密碼加密后再存入數(shù)據(jù)文件。 圖3-4登錄結(jié)構(gòu)流程圖4 運行效果 (1) 在編寫完tcp服務端程序server.c后,編寫一個makefile文件:all:gcc ./cirlist.c *.c -lpthread -wallrm client.dat

54、touch client.dat執(zhí)行make。(2) 在編寫完tcp客戶端程序client.c后,編寫一個makefile文件:all:gcc ./cirlist.c *.c -lpthread -lcrypt執(zhí)行make。(3) 在主機上打開一窗口,運行server。(4) 再打開另一個窗口,運行client 1001。(5) 再打開另一個窗口,運行client 1002。(6) 再打開另一個窗口,運行client 1003。(7) 輸入:【主】# ./a.out(8) 【從】# ./a.out(9) 客戶端、server端端窗口之間以及交錯發(fā)送信息的方式相互發(fā)送和接收信息。(10) 客戶端

55、登錄時若有其他人在線,則可用調(diào)整,并按回車選擇與其私聊。還可以選擇群聊和退出。在私聊中在$file$后加文件名可實現(xiàn)文件傳輸,在$moon$后加數(shù)字(0-9)可發(fā)送表情。 開始運行后,客戶端1001窗口的執(zhí)行順序為:1) 注冊;2) 登陸;3) 選中新登陸的好友1002,進行私聊;4) 發(fā)送文件hello.txt給客戶端1002;5) 輸入quit!結(jié)束私聊。6) 進入群聊7) 輸入quit!結(jié)束群聊。8) 注銷 開始運行后,客戶端1002窗口的執(zhí)行順序為:1) 注冊;2) 登陸;3) 選中好友1001,進行私聊;4) 接收客戶端1001發(fā)來的文件 hello.txt;5) 鍵入quit!結(jié)束私聊。6) 進入群聊7)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論