版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、基于linux網(wǎng)絡聊天室的設計與實現(xiàn)摘要基于資源共享和軟件自由的思想,limix成為越來越多技術人員的理想之國。作為 一個穩(wěn)定的多用戶類unix網(wǎng)絡操作系統(tǒng),linux能提供完美的網(wǎng)絡解決方案,出色的勝 任網(wǎng)絡構建和維護。出于對unix技術優(yōu)勢的出色繼承和延續(xù),linux對多種網(wǎng)絡協(xié)議的 支持使得網(wǎng)絡解決方案極大的豐富。在linux屮的網(wǎng)絡編程是通過socket接口來進行的,socket是tcp/ip網(wǎng)絡的api。不 但是一種特殊的i/o,它也是一種文件描述符。socket有tcp和udp兩個協(xié)議,tcp協(xié)議 有數(shù)據(jù)的可靠性、應用的實時性、網(wǎng)絡的可靠性三個優(yōu)點。因此選擇tcp協(xié)議更為可靠。本系
2、統(tǒng)實現(xiàn)了在linux網(wǎng)絡聊天室的基本功能。在linux下編寫并調(diào)試服務器端程 序和客戶端程序,實現(xiàn)了客戶、服務器之間的連接接和通信。可以在單機上開辟兩個窗 口分別運行客戶、服務器端的程序,或者兩臺主機鏈接分別作為客戶和服務器的方式。 總體來說,此設計以嵌入式c語言為開發(fā)語言,使用網(wǎng)絡套接字socket建立連接,并運 用多線程實現(xiàn)數(shù)據(jù)的交換,程序經(jīng)gcc調(diào)試成功,可以在單機網(wǎng)絡聊天中使用。關鍵字:網(wǎng)絡聊天室;linux; socket; tcp; c語言network chat room of design and implementation under linuxabstracton the
3、 basis of the thought with free resource-sharing and software, linux becomes more and more technical staffs ideal country.and is attracting more persons to join in this ideal constantly.as a steady multi-user unix network operating system, linux can offer the perfect network solution and is competen
4、t of constructing and maintaining the network excellent.for the inheritting and extending splendidly of technological advantage to unix, the abundance that linux support to many kinds of procotols makes the network with great solution.in linux, network programming is carried out through the socket i
5、nterface,socket is the api of tcp / ip network.not only is a special 1 / o but also is a file descriptor.socket has two protocols which are tcp and udp.tcp protocol has three advantages of the eliability of data, the application of real-time and the network reliability.so it is more reliable to choo
6、se tcp protocol.the system implementate the basic function of the network chat room under linux. prepared and debugging server and client program in the linux,achieved the links and communication between tne server and client. can open up two windows in a single machine to run the server and client
7、program respectively,or to connect twohosts,respectively, as the way of the client and serve匚 overall.the design use c language for the development language, creat link using the network socket,and use multiple to the exchange of data. the program by the success of gcc debug debugger, you can use it
8、 in the chat of stand-alone networkkeyword: network chat rooms; linux; socket; c language目錄摘要iabstractii第一章緒論11.1研究背景11.2應用概述21.3優(yōu)點31.4論文主耍工作4第二章linux網(wǎng)絡聊天室工具概述52歐入式c語言52.2 gcc編譯器5221 gcc的用法52.2.2調(diào)試和剖析選項72.3 gdb調(diào)試器72.3.1 gdb 的用法72.3.2用gdb調(diào)試gcc程序82.4 makefile文件的編寫9第三章實現(xiàn)分析及關鍵技術113實現(xiàn)分析113.1.1功能分析113.1.2
9、設計分析113.1.3技術分析123.2 tcp 通信123.3 多線程(pthread)133.3線程 pthread133.3.2數(shù)據(jù)類型及用法143.4 互斥量(mutex)153.5網(wǎng)絡套接字(socket)183.5.1 概述183.5.2地址及順序處理183.5.3連接函數(shù)的說明21第四章linux網(wǎng)絡聊天室socket編程實現(xiàn)過程244.1聊天室socket編程連接的過程244.2聊天室程序設計及界面254.2.1服務器的啟動254.2.2客戶端主界面及聊天功能展示284.2.3異常處理33第五章總結34參考文獻35附錄36致謝50第一章緒論1.1研究背景l(fā)inux是一種針對pc
10、計算機和工作站的操作系統(tǒng),linux是為普通個人電腦設計,可 免費分發(fā)的、兼容unix的操作系統(tǒng)。它支持各種各樣的軟件(包括大量免費軟件)。它是 在386屯腦上開發(fā)出來的,它現(xiàn)在支持486、586、pentium> powerpc、sun sparc和dec alp ha的硬件。linus torvald和其它的遍布世界各地的編程人員共同開發(fā)的,作為一種 操作系統(tǒng),它具有與unix、mac、windows和windows nt同樣的功能。提到linux就不能不提gnu和unix。richard m.stallman建立的自由軟件聯(lián)盟出版了 網(wǎng)種許可證,gnu通用公共許可證(gnu gne
11、ral public license, gpl)和gnu函數(shù)庫通用 公共許可證(gnu library gneral public license, lgpl)。大部分gnu工程的軟件和文檔 是以gnu通用公共許可證發(fā)行的,但是冇一些庫是以gnu函數(shù)庫通用公共許可證發(fā)行 的。按照gnu通用公共許可證的規(guī)定,linux的源代碼可以自由獲取,這滿足了我們學 習該系統(tǒng)的強烈愿望。gpl充分體現(xiàn)了stallman的思想:只要用戶所做的修改是同等自 由的,用戶可以門由地使用、拷貝、杳詢、重用、修改甚至發(fā)布這個軟件。通過這種方 式,gpl保證了linux(以及同一許可證下的大量其他軟件)不僅現(xiàn)在口由可用,
12、而且以后 經(jīng)過任何修改這后都仍然可以自由使用unix是由att貝爾實驗室的ken thompson和dennis ritchie于1969年在一臺已經(jīng) 廢棄了的pdp-7上開發(fā)的;最初它是一個用匯編語言寫成的單用戶操作系統(tǒng)。后來,他們 又在pdp-11 ±用c語言重新編寫(發(fā)明c語言的部分目的就在于此),把unix做成為了一個 文木處理系統(tǒng),這使unix在貝爾實驗室得到廣泛的應用。unix的最初版本免費提供給許 多知名的大學的計算機系使用。加州大學伯克利分校的計算機系就是其屮的一名,并地 unix進行了修改增加了許多新的特點,這就是廣為人知的bsc版本的unix。與此同時, 其它獨立
13、開發(fā)的unix版木也開始萌生。unix不斷發(fā)展了,各種版木被應用到不同的計 算機使用。而linux最初是專門為基于int引的個人計算機設計的。1、linux的早期1991年,一名叫l(wèi)inus torvalds的芬蘭大學生對unix齊種版本對于80386類的機器的 脆弱支持十分不滿,他決定要開發(fā)出一個全功能的、支持posix標準的、類unix的操作系統(tǒng)內(nèi)核,該系統(tǒng)吸收了bsd和systemv的優(yōu)點,同進摒棄了它們的缺點。他獨立把 這個內(nèi)核開發(fā)到0.02版,這個版本已經(jīng)可以運行gcc、bash和很少的一些應用程序。1994 年,linux已經(jīng)升級到1.0版本。它的源代碼量也呈指數(shù)形式增長,實現(xiàn)了基
14、本的tcp/ip 功能,此吋linux已經(jīng)擁有大約10萬的用戶。2、linux的現(xiàn)狀作為一各服務器級的操作系統(tǒng),linux已經(jīng)成熟了。現(xiàn)在的linux內(nèi)核由150多行代碼 組成,能作為web服務器平臺,也為越來越多的商業(yè)用戶提供文件和打印服務。它既被 當作郵件服務器的一種候選平臺,也被當作一種強壯而安全的防火墻。linux的企業(yè)級特性,比如支持多處理器、支持大型文件系統(tǒng)、志文件系統(tǒng)以及 密集型計算和高可用性集群技術,也逐步成熟,桌面上的linux也在繼續(xù)完善。3、linux的未來linux最強大的生命力在于其公開的開發(fā)過程。每個人都有可以自由獲取內(nèi)核源程 序,每個人都有要不得以運載源程序加以修
15、改,而后他人也可以自由獲取你修改后的源 程序。linux這種獨特的口由流暢的開發(fā)模型已被命名為bazaar(集山模型)。bazaar開發(fā) 模型通過重視實驗,征集并充分利用早期的反饋,對巨大數(shù)量的腦力資源進行平衡配置, 口j以開發(fā)出更優(yōu)秀的軟件。1.2應用概述嵌入式系統(tǒng)是指操作系統(tǒng)和功能軟件集成于計算機硬件系統(tǒng)z屮。簡單的說就是系 統(tǒng)的應用軟件與系統(tǒng)的硬件一體化,類似與bios的工作方式。具有軟件代碼小、高度 自動化、響應速度快等特點,特別適合于要求實時的和多任務的休系。隨著intenet的口益發(fā)展和普及,網(wǎng)絡在歐入式系統(tǒng)中應用非常廣泛,越來越多的戦 入式設備采用linux操作系統(tǒng)。linux在
16、近十年的時間里發(fā)展迅速,不僅奠定了堅實的 網(wǎng)絡基礎,成為眾多服務器強有力的支持,更是發(fā)展了嵌入式領域乃至桌面領域。linux 作為一種自由免費的操作系統(tǒng),相對于windows具冇良好的穩(wěn)定性和出色的網(wǎng)絡性能, 此被廣泛應用于各種網(wǎng)絡服務器。盡管在短期內(nèi)還不能形成規(guī)模與windows系統(tǒng)相抗衡, 但是他的發(fā)展勢頭已不可阻扌當。在服務器領域,linux已經(jīng)是后來居上,占領了微軟 windows服務器的一些市場,甚至有取代unix的跡彖。linux是一個源代碼公開的免費操作系統(tǒng),具有強移植性,所以對基于linux的socket網(wǎng)絡編程的研究越來越重要,其c/s模式如圖l1所示。客戶端|i服務器i圖1
17、.1客八端/服務器模式socket實際是網(wǎng)絡傳輸層供給應用層的編程接口。傳輸層則在網(wǎng)絡層的基礎上提供 進程到進程訪問的邏輯通道,而應用層的進程則利用傳輸層向另一臺主機的某一進程通 信。socket就是應用層與傳輸層之間的橋梁,如圖1.2所示。serve r應用層4t socket 傳輸層 網(wǎng)絡層 數(shù)將鏈路層物理層圖1.2 socket是傳輸層與應用層間的橋梁使用socket編程時可以開發(fā)客戶機和服務器應用程序,它們可以在木地網(wǎng)絡上進行 通信,也可以通過internet在全球范圍內(nèi)進行通信。編寫并運行socket的客戶端和服務 器端程序,雙方通過套接字建立了服務連接請求,并月通過一些方法捉高so
18、cket的性能。 1.3優(yōu)點近年嵌入式系統(tǒng)發(fā)展成為熱點,linux環(huán)境下利用socket設計網(wǎng)絡聊天室系統(tǒng),是 嵌入式發(fā)展的一個趨勢2,主要因為它有以下三個優(yōu)點:1、linux作為一個開源的操作系統(tǒng),利于使用人員交流學習,而且linux的許多特 性有利于網(wǎng)絡編程。首先,linux系統(tǒng)擁有許多網(wǎng)絡編程的庫函數(shù),可以方便地實現(xiàn)客 戶機/服務器模型。其次,linux秉承了unix的設備無關性這一優(yōu)秀特征,即它通過 文件的描述符實現(xiàn)了統(tǒng)一的設備接口,網(wǎng)絡的socket數(shù)據(jù)傳輸是一種特姝的i/o , scoket 也是一種文件描述符。再有,且其內(nèi)核小、效率高、兼容性好和穩(wěn)定性強等優(yōu)點。2、socket接
19、口是一個通用的接口,它不僅支持各種網(wǎng)絡工作形式,而且還是一個交 互式通訊機制。一個套接字描述一個通訊連接的一端。套接字可以被看做一個專門的管 道,但又不像管道,套接字對它們能容納的數(shù)量沒有限制,且linux支持多種類型的套 接字。3、目前計算機網(wǎng)絡持續(xù)而高速地發(fā)展,其中基于tcp/ ip協(xié)議網(wǎng)絡已經(jīng)成為計算機 之間組網(wǎng)的常見形式.基于tcp/ ip的網(wǎng)絡編程,也得到了廣泛的應用。tcp/ip這個種網(wǎng)絡 協(xié)議是interne啲基礎協(xié)議。它是一組計算機通信協(xié)議族,具有開放式互聯(lián)環(huán)境,很容 易實現(xiàn)各種局域網(wǎng)和廣域網(wǎng)的集成式互聯(lián)。socket通訊所采用的協(xié)議分為面向連接和面 向非連接兩種,rhtudp
20、盡最人努力但提供不可靠的服務,簡單的udp算法可以在本地 網(wǎng)絡條件好的環(huán)境屮良好工作,但在環(huán)境較復雜的網(wǎng)絡中就不能正常工作了,必須通過 超時和重傳來實現(xiàn)可靠性,而tcp則提供了數(shù)據(jù)傳輸?shù)耐耆煽啃裕虼诉x擇tcp通信 協(xié)議更可靠些。1.4論文主要工作本文是根據(jù)linux壞境下socket套接字通信原理利用c語言編程的網(wǎng)絡聊天室系統(tǒng)。第一章:緒論主要簡介了 linux網(wǎng)絡聊天室的研究背景,同時對于具應用和優(yōu)點進行了概述,是 對本系統(tǒng)的整個研究背景的研究介紹。第二章linux網(wǎng)絡聊天室環(huán)境及工具概述本章介紹了對使用的開發(fā)語言一c語言進行了概述;還介紹了本系統(tǒng)使用的編譯及 調(diào)試工具;最后,還對木系統(tǒng)
21、使用的文件編譯規(guī)則makefile文件進行了介紹和程序講解。第三章linux聊天室的實現(xiàn)分析及關鍵技術首先,對本系統(tǒng)的要實現(xiàn)的功能、要處理的數(shù)據(jù)和所需的技術進行分析、總結。其 次,介紹了所需的技術(tep、線程、mutex(互斥量)、socket)o第四章linux網(wǎng)絡聊天室socket編程實現(xiàn)過程此章借助socket的鏈接過程,介紹了木聊天室系統(tǒng)編程的大體過程及主要實現(xiàn)代碼 的講解。z后,對本聊天室系統(tǒng)的功能實現(xiàn)及異常處理過程(內(nèi)附截圖及部分主要代碼)。第二章linux網(wǎng)絡聊天室工具概述2.1嵌入式c語言c是一種在unix操作系統(tǒng)的早期就被廣泛使用的通用編程語言。它最早是由貝 爾實驗室的de
22、nnis ritchie為了 unix的輔助開發(fā)而寫的,開始時unix是用匯編語 言和一種叫b的語言編寫的。從那時候起,c就成為世界上使用最廣泛計算機語言。c 能在編程領域里得到如此廣泛支持的原因有以下一些:1、它是一種非常通用的語言。幾乎所能想到的任何一種計算機上都冇至少一種能 用的c編譯器。并且它的語法和函數(shù)庫在不同的平臺上都是統(tǒng)一的,這個特性對開發(fā) 者來說很有吸引力。2、用c寫的程序執(zhí)行速度很快。3、c是所有版本的unix上的系統(tǒng)語言。4、c在過去的二十年中有了很大的發(fā)展。在80年代末期美國國家標準協(xié)會 (american national standards institute)發(fā)布了
23、一個被稱為 ansi c 的 c 語言標準。這更 加保證了將來在不同平臺上的c的一致性。在80年代述岀現(xiàn)了一種c的面向對彖的 擴展稱為c+。2.2 gcc編譯器2.2.1 gcc的用法1、概述linux上可用的c編譯器是gnu c編譯器,它隨slack ware linux發(fā)行的。 gnuc編譯器(gcc)是一個全功能的ansic兼容編譯器。</br>使用gcc,通常后跟一些選項和文件名來使用gcc編譯器。gcc命令的基 本用法如下:gcc options filenames命令行選項指定的操作將在命令行上每個給出的文件上執(zhí)行9。2、gcc選項gcc有超過100個的編譯選項可用。這
24、些選項屮的許多可能永遠都不會用到,但 一些主要的選項將會頻繁用到。很多的gcc選項包括一個以上的字符。因此必須為 每個選項指定各自的連字符,并且就象大多數(shù)linux命令一樣不能在一個單獨的連字 符后跟一組選項。例如,下而的兩個命令是不同的:gcc -p -g test.cgcc -pg tcst.c第一條命令告訴gcc編譯test.c時為prof命令建立剖析(profile)信息并j1把調(diào) 試信息加入到可執(zhí)行的文件里。第二條命令只告訴gcc為gprof命令建立剖析信息。 當不用任何選項編譯一個程序時,gcc將會建立(假定編譯成功)一個名為a.out的可執(zhí) 行文件。例如,下面的命令將在當前目錄下
25、產(chǎn)生一個叫a.out的文件:gcc test.c用-o編譯選項來為將產(chǎn)生的口j執(zhí)行文件指定一個文件名來代替a.outo例如,將一個叫 count.c的c程序編譯為名叫count的可執(zhí)行文件,將輸入下面的命令:gcc o count count.c注意:當使用-o選項時,后面必須跟一個文件名。gcc同樣冇指定編譯器處理多少的編譯選項。c選項告訴gcc僅把源代碼編譯 為h標代碼而跳過匯編和連接的步驟。這個選項使用的非常頻繁因為它使得編譯多個c 程序吋速度更快并且更易于管理。缺省吋gcc建立的口標代碼文件有一個.0的擴展 名。s編譯選項告訴gcc在為c代碼產(chǎn)生了匯編語言文件后停止編譯。gcc產(chǎn)生 的
26、匯編語言文件的缺省擴展名是.s o -e選項指示編譯器僅對輸入文件進行預處理。 當這個選項被使用時,預處理器的輸出被送到標準輸出而不是儲存在文件里。</br>優(yōu)化選項:當用gcc編譯c代碼時,它會試著用最少的時間完成編譯并且使編譯后的代碼 易于調(diào)試。易于調(diào)試意味著編譯后的代碼與源代碼有同樣的執(zhí)行次序,編譯后的代碼沒 有經(jīng)過優(yōu)化。有很多選項可用于告訴gcc在耗費更多編譯時間和犧牲易調(diào)試性的基礎 上產(chǎn)生更小更快的可執(zhí)行文件。這些選項屮最典型的是0和-02選項。0選項告訴 gcc對源代碼進行基本優(yōu)化,這些優(yōu)化在大多數(shù)情況下都會使程序執(zhí)行的更快;02選項告訴gcc產(chǎn)生盡可能小和盡可能快的代
27、碼,02選項將使編譯的速度比使用-0時 慢,但通常產(chǎn)生的代碼執(zhí)行速度會更快。除了0和-02優(yōu)化選項外,還有一些低級 選項用于產(chǎn)生更快的代碼。這些選項非常的特殊,而且最好只冇當完全理解這些選項將 會對編譯后的代碼產(chǎn)生什么樣的效果吋再去使用。2.2.2調(diào)試和剖析選項gcc支持數(shù)種調(diào)試和剖析選項。在這些選項里你會最常用到的是-g和-pg選 項。-g選項告訴gcc產(chǎn)生能被gnu調(diào)試器使用的調(diào)試信息以便調(diào)試你的程序。gcc提供了一個很多其他c編譯器里沒有的特性,在gcc里能使-g和0 (產(chǎn)生 優(yōu)化代碼)聯(lián)用。這一點非常有用因為你能在與最終產(chǎn)品盡可能相近的情況下調(diào)試代碼。 在同時使用這兩個選項時必須清楚所
28、寫的某些代碼已經(jīng)在優(yōu)化時被gcc作了改動。pg選項告訴gcc在程序里加入額外的代碼,執(zhí)行時產(chǎn)生gprof用的剖析信息 以顯示程序的耗吋情況。2.3gdb調(diào)試器2.3.1 gdb的用法linux包含了一個叫gdb的gnu調(diào)試程序。gdb是一個用來調(diào)試c和c 程 序的強力調(diào)試器。它能在程序運行時觀察程序的內(nèi)部結構和內(nèi)存的使用情況。以下 是gdb所提供的一些功能:它使你能監(jiān)視傷程序屮變量的值。它使你能設置斷點以使程序在指定的代碼行上停止執(zhí)行。它使你能一行行的執(zhí)行你的代碼。/br在命令行上鍵入gdb并按回車鍵就可以運行 gdb 了,如果一切正常的話,gdb將被啟動并且將在屏幕上看到類似的內(nèi)容:gdb
29、is free software and you are welcome to distribute copies of itunder certain conditions; type "show copying*' to see the conditions.there is absolutely no warranty for gdb; type "show warranty” for details.gdb 4.14 (i486-slakware-linux), copyright 1995 free software foundation, inc.(gd
30、b)當啟動gdb后,在命令行上指定很多的選項。也可以以下面的方式來運行gdb: gdb當用這種方式運行gdb,能直接指定想要調(diào)試的程序。這將告訴gdb裝入名為 fhame的可執(zhí)行文件。也可以用gdb去檢查一個因程序異常終止而產(chǎn)生的core文件, 或者與一個正在運行的程序相連。2.3.2用gdb調(diào)試gcc程序為調(diào)試編譯代碼(compiling code for debugging),為了使gdb正常t作,你必須使 你的程序在編譯時包含調(diào)試信息。調(diào)試信息包含你程序里的每個變量的類型和在可執(zhí) 行文件里的地址映射以及源代碼的行號。gdb利用這些信息使源代碼和機器碼相關聯(lián)。 在編譯時用-g選項打開調(diào)試選
31、項。gdb基本命令:gdb支持很多的命令使你能實現(xiàn)不同的功能。這些命令從簡單的文件裝入到允許 你檢查所調(diào)用的堆棧內(nèi)容的復雜命令,下面列出了你在用gdb調(diào)試時會用到的一些命 令。如:file裝入想耍調(diào)試的可執(zhí)行文件。kill終止止在調(diào)試的程序。list執(zhí)行一行源代碼但不進入函數(shù)內(nèi)部。next執(zhí)行一行源代碼但不進入函數(shù)內(nèi)部。step執(zhí)行一行源代碼而且進入函數(shù)內(nèi)部。run執(zhí)行當前被調(diào)試的程序。quit 終止 gdbowatch使你能監(jiān)視一個變量的值而不管它何吋被改變。break在代碼里設置斷點,這將使程序執(zhí)行到這里時被掛起。make使你能不退出gdb就可以重新產(chǎn)生可執(zhí)行文件。shell使你能不離開g
32、db就執(zhí)行unix shell命令。gdb支持很多與unix shell程序一樣的命令編輯特征。你能象在bash或tcsh里 那樣按tab鍵讓gdb幫你補齊一個唯一的命令,如果不唯一的話gdb會列出所有匹 配的命令,你也能用光標鍵上下翻動歷史命令叨。2.4 makefile文件的編寫以上研究了編譯工具gcc和調(diào)試工貝gdb,編程的程序文件都要經(jīng)過編譯、調(diào)試, 但是如果系統(tǒng)是的文件很多,又冇先后順序時,編譯時就很麻煩的。因此本系統(tǒng)使用了 makefile 文件?;蛟S很多的程序員都不知道這個東& makefile ,因為大多windows的ide都為程 序員做了這個工作,在unix下的軟件
33、編譯,你就不能不自己寫makefile 了,會不會寫 makefile,從一個側面說明了一個人是否具備完成大型工程的能力。因為makefile關系 到了整個工程的編譯規(guī)則。一個工程中的源文件不計數(shù),其按類型、功能、模塊分別放 在若干個廿錄中makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文 件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作,而且其中還可 以執(zhí)行操作系統(tǒng)的命令。makefile帶來的好處就是“自動化編譯”,一旦寫好,只需 要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發(fā)的效率。make是一 個命令工具,是一個解釋makefile
34、9;l1指令的命令工具,一般來說,大多數(shù)的ide都有這 個命令,比如:visual c+的 nmakc, linux b gnu 的 make??梢?,makefile 都成為 了一種在工程方面的編譯方法。我們要寫一個makefile來告訴make命令如何編譯和鏈接這兒個文件。我們的規(guī)則是:1、如果這個工程沒有編譯過,那么我們的所有c文件都要編譯并被鏈接。2、如果這個工程的某幾個c文件被修改,那么我們只編譯被修改的c文件,并鏈接 口標程。3、如果這個工程的頭文件被改變了,那么我們需要編譯引用了這兒個頭文件的c 文件,并鏈接目標程序。makefile的規(guī)則:target: prerequisite
35、s .command target也就是一個冃標文件,可以是object file,也可以是執(zhí)行文件。prerequisites 就是,要生成那個target所需要的文件或是目標。command也就是make需要執(zhí)行的命令。這是一個文件的依賴關系,也就是說,target這一個或多個的目標文件依賴于 prerequisites屮的文件,其生成規(guī)則定義在command + 0說白一點就是說,prerequisites 中如果有一個以上的文件比target文件要新的話,command所定義的命令就會被執(zhí)行。 這就是makefile的規(guī)則。又例如:objects = main.o kbd.o comm
36、and.o display.o insert.o search.o files.o utils.o于是,我們就可以很方便地在我們的makefile中以“$(objects)”的方式來使用這個變 量了,我們的makefile就變成下面這個樣子:makefile.h 文件cflag := -gcc := gccall:serverv3 clientscrvcrv3:scrvcrv3.c groupv3.o rcgist.o login.o showuscrv3.o hclp.o listv3.o singlcv3.o $(cc) $(cflag) -o serverv3 serverv3.c *.
37、o -lpthreadclient:client.c main.h$(cc) $(cflag) -o client client.c *.o -lpthreadclean:rm -rfv serverv3 client *.o這里我們的文件雖多,但不用我們一個一個的去gcc編譯,makefile文件已經(jīng)安排 好,以個make就可以按照個各個文件的依賴順序生成我們想要的.0文件。當我們想要 重新生成編譯時,其中clean可以清理掉上次產(chǎn)生的ii i文件,這只需耍命令make cleano 分別如下圖2和圖2.2所示。rootlocalhost chat20# makegcc-cgcc-cgcc-
38、cgcc-cgcc-cgcc-cgcc-cgcc -g-o-o groupv3.o groupv3.c-o regist.o regist.c-o login.o login.c-o showuserv3.o showuserv3c-o help.o help.c-o listv3.o listv3.c-o singlev3.o singlev3.cserverv3 serverv3.c *.o -lpthread圖2make命令的編譯界而rootlocalhost chat20# make clean rm -rfv serverv3 client己刪除 ''serverv3
39、z/己刪除''client己刪除、'groupv3.o己刪除 ''help.oz/ 己刪除 ''listv3.oz/ 己刪除 ''login. oz/ 己刪除 ''regist.oz/ 己刪除 ''showuserv3. o,z 己 嗓、'sinq:lev3.o”圖2.2 make clean命令的界面第三章實現(xiàn)分析及關鍵技術3.1實現(xiàn)分析3.1.1功能分析本系統(tǒng)是要在linux系統(tǒng)下實現(xiàn)一個聊天室系統(tǒng),主要有服務器和客戶端。它具備 的基木功能包括注冊、登陸、群聊、私聊、查看在線人數(shù)
40、、查看聊天記錄等。1、服務器端:負責處理用戶發(fā)來的各種信息,管理用戶的動作(用戶注冊、用戶登 錄、群發(fā)信息、和特定用戶私聊等)和管理用戶信息(保存用戶個人資料及聊天記錄等)。2、客戶端:主要是可以查看在線人數(shù)、聊天記錄,發(fā)送信息給特定用戶或群等功 能。(系統(tǒng)各個功能函數(shù)的清單見附錄表a.1)3.1.2設計分析本聊天系統(tǒng)的為c/s形式,服務器主要就是處理客戶的輸入信息。首先要存儲客戶 的個人資料;再有,傳輸客戶的聊天信息時,也要記錄下客戶的聊天記錄,以備查看聊 天記錄所用。當然,服務器述冇自己的動態(tài)數(shù)據(jù)處理??蛻魻顟B(tài)分為鏈接客戶、非鏈接 客戶,我們采用結構體存儲鏈接客戶的信息,以鏈表式來記錄鏈接
41、客戶。而鏈接客戶又 分為登陸用戶與未登陸用戶,這就通過修改鏈表上客戶的名字。當客戶以鏈接客戶服務 器端時,也就是述未登錄,就給了客戶一個統(tǒng)一的名字,當客戶登陸時就把其統(tǒng)一的名 字改為客戶登陸名,也就是客戶注冊時輸入的名字。同時并發(fā)服務器要一直在為連接用 戶創(chuàng)建線程,系統(tǒng)設計的總框圖2,如圖3.1所示。3.1.3技術分析基丁以上的功能分析和數(shù)據(jù)分析,首先通信socket套接字是實現(xiàn)c/s通信的接口,且 使用tcp協(xié)議。傳輸數(shù)據(jù)時,客戶端需要創(chuàng)建兩個線程分別監(jiān)聽鍵盤(即用戶輸入信息)和 socket接口 (即傳入信息)。服務器則要給每個鏈接的客戶創(chuàng)建一 個線程來進行信息的傳 輸,即實現(xiàn)并發(fā)服務器,
42、正如圖3.1所示。并發(fā)服務器是指在一個時刻可以處理多個客戶 請求的服務器。這只是概念上和表面的并發(fā),并不一定是真止同時處理多個請求,如果 服務器具有多個處理器,則是實際的并發(fā),但對于大多數(shù)服務器來說,是利用操作系統(tǒng) 的某種機能,比如異步i/o、多進程、多線程等技術來實現(xiàn)的,只是從客戶的角度看上去 看仿佛服務器并發(fā)地與多個客戶通訊。linux提供了兩種形式的并發(fā),進程和線程。i大i 此常見的并發(fā)服務器即是基于進程的并發(fā)和基于線程的并發(fā)兩種類型。線程并發(fā)服務器是使用就涉及到線程同步問題,mutex(互斥量)則能解決這個問題。 當然最主要的是socket函數(shù)調(diào)用??偨Y其上有tcp線程、mutex(互
43、斥量)、socketo3.2 tcp通信socket是建立在傳輸層協(xié)議(主要是tcp和udp)上的一種套接字規(guī)范,socket接口 是tcp/ ip網(wǎng)絡最為通用的api,也是在internet上進行應用開發(fā)最通用api,4,socket屏 蔽了底層通信軟件和具體操作系統(tǒng)的差異,使得任何兩臺安裝了tcp i辦議軟件和實現(xiàn) tsocket規(guī)范的計算機z間的通信成為可能。tcp是傳輸控制協(xié)議的簡稱,它是提供一條全雙工的、可靠的信道。tcp提供面向 連接的服務,在傳送數(shù)據(jù)之前必須先建立連接,數(shù)據(jù)傳送結束后要釋放連接。tcp不提 供廣播和多播服務。由于tcp要提供可靠的、面向連接的運輸服務,所以不可避免
44、地增加了許多系統(tǒng) 開銷,比如確認、流量控制、計時器以及連接管理等都需耍占用許多系統(tǒng)的時空資源。 兩個計算機z間如果使用tcp通信,其連接過程需要三次握手實現(xiàn)問,tcp對話通過 三次握手來初始化的。三次握手的口的是使數(shù)據(jù)段的發(fā)送和接收同步,并建立虛連接。下面描述了這三次握手的簡單過程。1、初始化主機通過一個同步標志置位的數(shù)據(jù)段發(fā)出會話請求。2、接收主機通過發(fā)回具有以下項目的數(shù)據(jù)段表示回復:同步標志置位、即將發(fā)送 的數(shù)據(jù)段的起始字節(jié)的順序號、應答并帶有將收到的下一個數(shù)據(jù)段的字節(jié)順序號。3、請求主機再回送一個數(shù)據(jù)段,并帶有確認順序號和確認號。如圖3.2所示-fc服務器syn標志,isn及ii的端口號
45、syn標志,isn及確 認信息(ack)確認信息(ack)客八端/請求端圖3.2 tcp三次握手3.3 多線程(pthread)3.3.1 線程 pthreadposix thread簡稱為pthread, posix線程是一個posix標準線程.該標準定義內(nèi)部api 創(chuàng)建和操縱線程卩叫點對點通信的實現(xiàn)知識完成了主機進程與服務器進程z間的連接, 建立連接的進程之間是一對一的聯(lián)系,即主機的一個進程與服務器的一個進程之間建立的 連接。而每個進程進行通信的環(huán)節(jié)都包括了發(fā)送信息和接口信息兩個任務,這兩個任務通 過一個端口地址發(fā)送和接收。對于多個并發(fā)的任務需要創(chuàng)建多個線程或線程去實現(xiàn)。使用一個進程去完成
46、發(fā)送信息 是沒有問題的,因為發(fā)送總是主動的;而使用同一個進程再去完成接受信息去不一定會成功,因為接受信息是被動的,所以當沒有信息可以接收時,該進程就會被阻塞,從而導致 發(fā)送任務也一起被阻塞。同一個端口的發(fā)送和接收是兩個并發(fā)任務,應該由兩個不同的任 務去分別完成信息的發(fā)送和接收。這樣,當接收信息任務因沒冇信息而被阻塞時,不至于 影響發(fā)送任務的執(zhí)行。那么,發(fā)送和接收兩個任務是使用兩個進程述是兩個進程去完成呢?在網(wǎng)絡通信中,端口地址是以進程為單位進程分配的,而一個進程與外界的消息發(fā)送 與接收必須通過分配給它的同一個端口進行。因此,不能通過創(chuàng)建進程方式來解決上訴問 題,因為網(wǎng)個進程會分別對應兩個不同的
47、端口,而發(fā)送和接收必須使用同一端口。線程不 是資源分配的單位,所以如果使用兩個線程不會對線程分配新的端口。因此,本實驗需要 使用兩個線程去分別完成發(fā)送和接收信息的任務,這兩個線程共享其進程擁有的統(tǒng)一個端 口地址。由于創(chuàng)建進程的進程本身會作為一個線程來調(diào)度,所以只需要再創(chuàng)建一個線程專 門負責接收信息就可以了。因此,對于從每個客戶端發(fā)來的請求,服務器端都要創(chuàng)建相應的線程去接收并處理; 同理,對于客戶端而言,也要創(chuàng)建一個線程去讀取服務器端發(fā)來的信息。3.3.2數(shù)據(jù)類型及用法1、各個函數(shù)類型pthread t:線程句柄pthread_create():創(chuàng)建一個線程pthread_exit():終止當前
48、線程pthreadjoin():阻塞當前的線程,直到另外一個線程運行結束pthread_attr_detach():獲取脫離狀態(tài)的屬性2、線程創(chuàng)建與結束(1 )pthread_t 線程的標識符類型,pthread t 在頭文件/usr/include/bits/pthreadtypes.h 中 定義:typedef unsigned long int pthread_t;(2) pthread_createthread_create用來創(chuàng)建一個線程,它的原型為:extern int pthread create _p (pthread t *_thread, _const pthread at
49、tr t *_attr,void *(*_start_routine) (void *),void *_arg);第一個參數(shù)為指向線程標識符的指針,第二個參數(shù)用來設置線程屈性,第三個參數(shù)是 線程運行函數(shù)的起始地址,最后一個參數(shù)是運行函數(shù)的參數(shù)。這里,我們的函數(shù)thread 不需要參數(shù),所以最后一個參數(shù)設為空指針。第二個參數(shù)我們也設為空指針,這樣將生成 默認屬性的線程。對線程屬性的設定和修改我們將在下一節(jié)闡述。當創(chuàng)建線程成功時, 函數(shù)返回0,若不為0則說明創(chuàng)建線程失敗,常見的錯誤返回代碼為eagain和einvalo 前者表示系統(tǒng)限制創(chuàng)建新的線程,例如線程數(shù)目過多了;后者表示第二個參數(shù)代表的線
50、程屬性值卄法。創(chuàng)建線程成功后,新創(chuàng)建的線程則運行參數(shù)三和參數(shù)四確定的函數(shù),原來 的線程則繼續(xù)運行下一行代碼。(3) pthreadjoin函數(shù)pthreadjoin用來等待一個線程的結束。函數(shù)原型為:extern int pthreadjoin _p (pthread_t _th, void *_thread_retum);第一個參數(shù)為被等待的線程標識符,第二個參數(shù)為一個用戶定義的指針,它可以用來 存儲被等待線程的返回值。這個函數(shù)是一個線程阻塞的函數(shù),調(diào)用它的函數(shù)將一直等待到 被等待的線程結束為止,當函數(shù)返回時,被等待線程的資源被收回。(4) pthread_exit線程除了正常執(zhí)行結束外,述
51、可以通過函數(shù)pthread exit來結束它,pthread exit的函 數(shù)原型為:extern void pthread exit _p (void *_retval) _attribute_ (_noretum_);唯一的參數(shù)是函數(shù)的返回代碼,只要pthrcadoin屮的第二個參數(shù)thrcad rctum不是 null,這個值將被傳遞給thread_returno最后耍說明的是,一個線程不能被多個線程等 待,否則第一個接收到信號的線程成功返回,其余調(diào)用pthreadjoin的線程則返冋錯誤 代碼esrchovoid thread(node *p)pthread_create(&t
52、idi,null,(void*)thread,ptr);34互斥量(mutex)網(wǎng)絡聊天系統(tǒng)多線程就涉及到線程同步問題,需耍用到互斥量?;コ鈱ο笫窍到y(tǒng)內(nèi) 核對象各線程都可以擁有它,誰擁有誰就能執(zhí)行;執(zhí)行完畢,用releasemutex函數(shù)釋放擁有權,以讓其他等待的線程使用?;コ饬繌哪举|(zhì)上說就是一把鎖,提供對共享資源 的保護訪問。1、初始化:在linux下,線程的互斥量數(shù)據(jù)類型是pthread_mutex_t.在使用前,要對它進行初 始化:對于靜態(tài)分配的互斥量,可以把它設置為pthread_mutexjnitializer,或者 調(diào)用 pthread mutex init.對于動態(tài)分配的互斥量,
53、在中請內(nèi)存(malloc)之后,通過pthread mutexjnit進行初 始化,并j1在釋放內(nèi)存(free)前需要調(diào)用pthread mutex destroy.原型:int pthread_mutex_init(pthread_mutex_t * restrict mutex, constpthrcad mutcxattr t *rcstric attr);int pthread_mutex_destroy(pthread_n)utex_t * mutex);頭文件:#includc <pthrcad.h>返冋值:成功則返冋0,出錯則返冋錯誤編號.說明:如果使用默認的屬性初始
54、化互斥量,只需把m設為null.其他值在以后講 解。2、互斥操作:對共享資源的訪問,要對互斥量進行加鎖,如果互斥量已經(jīng)上了鎖,調(diào)用線程會阻 塞,直到互斥量被解鎖.在完成了對共享資源的訪問后,要對互斥量進行解鎖。首先說一下加鎖函數(shù):頭文件:#include <pthread.h>原型:int pthread_mutex_lock(pthread_mutex_t * mutex);int pthread_mutex_trylock(pthread_itiutex_t *mutex);返冋值:成功則返冋0,出錯則返冋錯誤編號.解鎖函數(shù):頭文件:#include <pthread.h
55、>原型:int pthread_mutex_unlock(pthread mutex t *mutex);返回值:成功則返回0,出錯則返回錯誤編號.pthread_mutex_lock聲明開始用互斥鎖上鎖,此后的代碼直至調(diào)用 pthread mutex unlock為止,均被上鎖,即同一時間只 能被一個線程調(diào)用執(zhí)彳亍。當一個 線程執(zhí)行到pthread_mutexjock處吋,如果該鎖此吋被另一個線程使用,那此線程被阻 塞,即程序將等待到另一個線程釋放此互斥鎖以下是此聊天室系統(tǒng)的互斥量在main.h中定義:extern pthreadmutext mutex;#define lock(mu
56、tex) do 檢查上鎖是否正確if(pthread_mutexock(&mutex) != 0) perror(npthread_mutex_lockn); cxit(exit failure); while (0)#define unlock(mutex) do 檢查解鎖是否正確if(pthread_mutex_unlock(&mutex) != 0) perror('pthread_mutex_unlock); exit(exit_failure); while (0)注意:是接續(xù)符其屮,extern代表其他函數(shù)可以調(diào)用此變量,#define代表互斥量mutex是
57、帶參數(shù)的 宏定義。當需要上鎖時只需要調(diào)用lock(mutex),解鎖時則調(diào)用unlock(nwtex)就能 夠解鎖。3.5網(wǎng)絡套接字(socket)3.5.1概述1、連接步驟socket接口上tcp/ip網(wǎng)絡應用程序接口(api),它提供了許多函數(shù),本系統(tǒng)就使用 它們來開發(fā)tcp/ip網(wǎng)絡聊天室程序。使用socket接口進行網(wǎng)絡通信的過程,簡耍步驟如下:建立一個socket:(2) 按耍求配置socket,將socket連接到遠程主機或給socket指定以各木地協(xié)議端1 i。(3) 按要求通過socket發(fā)送和接受數(shù)據(jù)。(4) 關閉此 socket o這是通過socket實現(xiàn)點對點通信需要掌握的4個編程要點。2、socket定義卩勺在linux屮的網(wǎng)絡編程是通過socket接口來進行的。人們常說的socket接口是一 種特殊的i/o,它也是一種文件描述符。每一個socket都用一個半相關描述協(xié)議,本地 地址、本地端口來表示;一個完整的套接字則用一個相關
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024商業(yè)銷售代理合同
- 慢阻肺病人的護理要點
- 蘇州科技大學天平學院《環(huán)境工程原理》2021-2022學年第一學期期末試卷
- 2024民間借款抵押合同范本2
- 蘇州科技大學天平學院《風景園林建筑設計》2022-2023學年第一學期期末試卷
- 農(nóng)藥生產(chǎn)中的新型工藝與技術考核試卷
- 摩托車的減震器類型與材料考核試卷
- 危險源評估在城市社區(qū)醫(yī)院建設中的應用考核試卷
- 木材加工中的產(chǎn)品研發(fā)與創(chuàng)新設計考核試卷
- 農(nóng)藥制造中的工人安全與健康保護考核試卷
- 車用動力電池回收利用 管理規(guī)范 第2部分:回收服務網(wǎng)點征求意見稿編制說明
- 新劍橋少兒英語第六冊全冊配套文本
- 科學預測方案
- 職業(yè)生涯規(guī)劃網(wǎng)絡與新媒體專業(yè)
- T-WAPIA 052.2-2023 無線局域網(wǎng)設備技術規(guī)范 第2部分:終端
- 市政管道開槽施工-市政排水管道的施工
- 初中八年級英語課件Reading Giant pandas-“江南聯(lián)賽”一等獎2
- 人工智能在教育行業(yè)中的應用與管理
- 心衰合并胸腔積液的護理Ppt
- 廉潔風險防控手冊(醫(yī)院)
- 酒精戒斷綜合征護理查房課件
評論
0/150
提交評論