




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、一、 引言(簡要說明設(shè)計(jì)題目的目的、意義、內(nèi)容、主要任務(wù)等)1.1設(shè)計(jì)目的本次系統(tǒng)軟件課程設(shè)計(jì)的主要目的有兩個(gè):一方面是分析設(shè)計(jì)linux源代碼,另一方面是進(jìn)行系統(tǒng)級(jí)的程序設(shè)計(jì)。1.2 題目與要求我計(jì)劃編寫的題目是:小學(xué)算術(shù)運(yùn)算測試程序。制作一個(gè)可供小學(xué)數(shù)學(xué)運(yùn)算的程序:10以內(nèi)加減法,能根據(jù)輸入題數(shù)出題,判斷題是否正確,最后計(jì)算分?jǐn)?shù)。并用make工程管理器編譯,編寫makefile文件。簡單聊天程序。在linux下用c語言編寫一個(gè)簡單的網(wǎng)絡(luò)聊天程序。實(shí)現(xiàn)網(wǎng)絡(luò)傳輸功能。1.3內(nèi)容及主要任務(wù)小學(xué)算術(shù)運(yùn)算測試程序:要求完成 10 以內(nèi)的加減運(yùn)算。 能根據(jù)用戶 輸入的想要練習(xí)的題目數(shù)自行出題。用戶輸入
2、答案后可以判斷正誤,并能給出算對(duì)及算錯(cuò)的題目數(shù),最后計(jì)算出分?jǐn)?shù)。同時(shí),對(duì)于用戶算錯(cuò)的題目會(huì)發(fā)出報(bào)警聲,提示用戶注意,同時(shí)給出正確結(jié)果。做完一次測試后用戶可決定是否繼續(xù)進(jìn)行下一次測試。簡單聊天程序:本課題是建立聊天通信模型,設(shè)計(jì)一個(gè)聊天室軟件, 包括服務(wù)器端和客戶端, 主要功能為:、 服務(wù)器端功能:初始化 socket創(chuàng)建服務(wù)器端。維護(hù)一個(gè)鏈表,保存所有用戶的 ip 地址、端口信息。接受用戶傳送來的聊天信息,然后向鏈表中的所用用戶轉(zhuǎn)發(fā)。接受用戶傳送來的連接判斷命令,并向用戶發(fā)出響應(yīng)命令。、 客戶端功能: 客戶端界面上的兩個(gè)文本框,一個(gè)用于顯示接受的聊天信息,一個(gè)用來接受用戶輸入的聊天信息。當(dāng)按下
3、“發(fā)送”按鈕時(shí)將信息發(fā)送給服務(wù)器。1.4題目設(shè)計(jì)意義通過本課題的畢業(yè)設(shè)計(jì),熟悉了關(guān)于linux下c語言的系統(tǒng)軟件程序設(shè)計(jì),可以比較深入的了解和掌握 winsock 控件基本屬性、方法和事件,理解 網(wǎng)絡(luò)聊天通信的概念,輸控制協(xié)議(tcp)進(jìn)行數(shù)據(jù)交流,初步掌握網(wǎng)絡(luò)聊天通信程序的設(shè)計(jì)方法。 并能鞏固和擴(kuò)展大學(xué)期間的學(xué)習(xí)內(nèi)容,進(jìn)行項(xiàng)目的設(shè)計(jì)開發(fā)訓(xùn)練,更好的適應(yīng)社會(huì)的需求。隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的快速發(fā)展,人們的交流方式越來越多,傳統(tǒng)的通信方式在速度和可靠性方面已經(jīng)很難滿足人們的需要,即時(shí)通信系統(tǒng)已成為人們的新寵。同時(shí),即時(shí)通信系統(tǒng)對(duì)現(xiàn)代企業(yè)也有著重大意義,它為諸企業(yè)開拓了網(wǎng)絡(luò)應(yīng)用的新領(lǐng)域。自從它誕生以來
4、,以實(shí)時(shí)交互、資費(fèi)低廉等優(yōu)點(diǎn),受到廣大個(gè)人用戶的喜愛,已經(jīng)成為網(wǎng)絡(luò)生活中不可或缺的一部分。本著學(xué)以致用的原則,本人開發(fā)了這套多點(diǎn)聊天系統(tǒng),以滿足網(wǎng)絡(luò)用戶的通訊需求。該系統(tǒng)具有操作簡單、界面友好、功能專一等特點(diǎn)。本報(bào)告就系統(tǒng)的開發(fā)過程做了詳細(xì)的介紹,并對(duì)系統(tǒng)的原理、總體設(shè)計(jì)等方面做了深入細(xì)致的討論。二、 正文(課程設(shè)計(jì)的主要內(nèi)容,包括實(shí)驗(yàn)與觀測方法和結(jié)果、儀器設(shè)備、計(jì)算方法、編程原理、數(shù)據(jù)處理、設(shè)計(jì)說明與依據(jù)、加工整理和圖表、形成的論點(diǎn)和導(dǎo)出的結(jié)論等。正文內(nèi)容必須實(shí)事求是、客觀真切、準(zhǔn)確完備、合乎邏輯、層次分明、語言流暢、結(jié)構(gòu)嚴(yán)謹(jǐn),符合各學(xué)科、專業(yè)的有關(guān)要求。)任務(wù)一:小學(xué)數(shù)學(xué)運(yùn)算程序2.1.1
5、主要內(nèi)容 本程序共分為五個(gè)模塊:出題模塊、答題模塊、檢查計(jì)分模塊、評(píng)分模塊和評(píng)價(jià)模塊;下面分別對(duì)這五個(gè)模塊的算法做一下介紹。出題模塊:一個(gè)答題系統(tǒng)自然而然首先就是要有題目且能夠根據(jù)條件出題;在本模塊中,首先設(shè)了一個(gè)含有15個(gè)指針的指針數(shù)組,指針數(shù)組里的每個(gè)指針都指向了相應(yīng)題號(hào)的選擇題,這樣就實(shí)現(xiàn)了對(duì)題目的儲(chǔ)存;然后用 scanf 函數(shù)來實(shí)現(xiàn)從鍵盤上輸入題號(hào),用 if 語句控制輸題的范圍;題號(hào)不在 1-15 的范圍內(nèi)就提示選題出錯(cuò);在輸入題號(hào)的過程中輸入相同題號(hào)是在所難免的;但 是在答題系統(tǒng)中輸入相同題號(hào)顯然沒有意義,所以另外設(shè)了一個(gè)靜態(tài)一維數(shù)組來儲(chǔ)存已輸過的題號(hào);且數(shù)組的第一個(gè)元素初始化為 0
6、,然后每輸入一個(gè)題號(hào)就賦給這個(gè)數(shù)組,同時(shí)用 for 語句來使當(dāng)前的題號(hào)一一與儲(chǔ)存在一維數(shù)組中已輸過的題號(hào)進(jìn)行比較,如題號(hào)有相同,就提示重答,重答的功能是通過對(duì)出題模塊函數(shù)的遞歸調(diào)用來實(shí)現(xiàn)的,如題號(hào)沒有相同,就通過輸入的題號(hào)借助指針數(shù)組里的指針找到與題號(hào)對(duì)應(yīng)的選擇題,用 puts 函數(shù)來實(shí)現(xiàn)對(duì)選擇題的輸出;最后用 return 語句將其他模塊返回來每道題的小分?jǐn)?shù)返回到主函數(shù)中(在主函 數(shù)中調(diào)用出題模塊函數(shù))。答題模塊:出完題后自然是從鍵盤上輸入答案了,在本模塊中,提示輸入答案后,用 scanf 函數(shù)來實(shí)現(xiàn)使從鍵盤上輸入的一個(gè)答案選項(xiàng)(a、b、c、d) 賦給一個(gè)用來記錄答案的字符變量;用 retu
7、rn 語句將這個(gè)變量返回到出題模塊中。檢查計(jì)分模塊:輸入答案選項(xiàng)后,就要判斷答案的正確性和計(jì)分了,在本模塊中,要設(shè)一個(gè)字符數(shù)組來儲(chǔ)存每道題的正確答案;用 if 語句來控制在答題模塊中輸入的答案是否為 a、b、c、d 中的某一個(gè);若不是,就提示選的答案不在答案范圍內(nèi),若是,根據(jù)在出題模塊中輸?shù)念}號(hào)使在答題模塊中輸入的答案選項(xiàng)與儲(chǔ)存正確答案數(shù)組中的相應(yīng)答案選項(xiàng)相比較,若相同,就提示答案正確,與此同時(shí)用變量記錄下這道題所得的小分,否則,就提示答案錯(cuò)誤并給出當(dāng)前題目的正確答案,不計(jì)分;用 return 語句將得分返回到出題系統(tǒng)中(在出題 模塊函數(shù)中調(diào)用檢查計(jì)分模塊函數(shù))。評(píng)分模塊:做完題后,就要根據(jù)做
8、題的對(duì)錯(cuò)個(gè)數(shù)來評(píng)分;在本模塊中,首先就要提示題目全做完,用switch語句根據(jù)總小分來選擇性地選出11個(gè)不同的分?jǐn)?shù)中的一個(gè)分?jǐn)?shù),并且打印出該分?jǐn)?shù) (在主函數(shù)中調(diào)用評(píng)分模塊函數(shù)) 。評(píng)價(jià)模塊:最后一步就是要根據(jù)不同的總得分段來給出不同的評(píng)語,在本模塊中用 if 語句根據(jù)不同的總分?jǐn)?shù)段來打印出不同的評(píng)語(在主函數(shù)中調(diào) 用評(píng)價(jià)模塊函數(shù)) 。主函數(shù)將這五個(gè)模塊直接地或間接地聯(lián)系在一起,使它們構(gòu)成本程序,現(xiàn)在就來介紹主函數(shù)的算法。主函數(shù)對(duì)出題模塊函數(shù)、評(píng)價(jià)模塊函數(shù)進(jìn)行了調(diào)用;首先提示開始答題,為了要答 10 次題,就要設(shè)一個(gè) for 語句來控制對(duì)出題模塊函數(shù)調(diào)用的次數(shù),即需要答一定次數(shù)的題,與此同時(shí)用一
9、個(gè)變量來累加由出題模塊函數(shù)返回來每道題的小分?jǐn)?shù);接下來分別對(duì)評(píng)分模塊函數(shù)和評(píng)價(jià)模塊函數(shù)進(jìn)行調(diào)用。以上就是對(duì)本程序算法的介紹。2.1.2 程序結(jié)構(gòu)及主要過程本程序共包含了順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)三種在 c 程序中的主要結(jié)構(gòu),其中穿插了數(shù)組(一維數(shù)組、字符數(shù)組)、指針 (指針數(shù)組)、函數(shù)調(diào)用(遞歸調(diào)用)等知識(shí),該程序覆蓋了本學(xué)期所學(xué)的除結(jié)構(gòu)體外的大部分知識(shí)。本程序結(jié)構(gòu)和過程思路如下:為了要答題,首先要有題目,設(shè)一個(gè)指針數(shù)組來實(shí)現(xiàn);把相應(yīng)的題目調(diào)出,應(yīng)用指針的功能實(shí)現(xiàn);調(diào)出題目后,就要給用戶答題了,用一個(gè)輸入函數(shù)實(shí)現(xiàn);再經(jīng)過系統(tǒng)的判斷,用一個(gè)字符數(shù)組儲(chǔ)存正確答案結(jié)合判斷語句實(shí)現(xiàn);最后累加計(jì)分,用
10、循環(huán)結(jié)構(gòu)實(shí)現(xiàn)??傊?該程序的總體結(jié)構(gòu)和過程很好的體現(xiàn)了現(xiàn)在所提倡的對(duì)一個(gè)程序結(jié)構(gòu)模塊化的思想。2.1.3 程序模塊功能說明 本程序一共有五個(gè)模塊,它們分別是:出題模塊(question_out(),答題 模塊(answer(),檢查計(jì)分模塊(check(),評(píng)分模塊(count(),評(píng)價(jià)模塊 (assessment(),現(xiàn)在就來分別介紹這五個(gè)模塊的功能。出題模塊(question_out():這一模塊主要負(fù)責(zé)對(duì)題目的儲(chǔ)存和調(diào)出這兩個(gè)功能。答題模塊(answer():這一模塊主要負(fù)責(zé)將用戶端的答案通過鍵盤輸入到系統(tǒng)。檢查計(jì)分模塊(check():這一模塊主要負(fù)責(zé)檢查判斷用戶所提供的答案是否正確并
11、根據(jù)它來記錄每題所的總分。評(píng)分模塊(count():這一模塊主要負(fù)責(zé)統(tǒng)計(jì)總得分并打印。評(píng)價(jià)模塊(assessment() :這一模塊主要負(fù)責(zé)根據(jù)給出的總得分打印相應(yīng)的評(píng)語。總之這五個(gè)模塊都有著各自的功能且互相聯(lián)系,五者在程序中缺一不可。2.1.4 makefile介紹makefile文件介紹makefile一個(gè)工程中的源文件不計(jì)數(shù),其按類型、功能、模塊分別放在若干個(gè)目錄中,makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進(jìn)行更復(fù)雜的功能操作,因?yàn)?makefile就像一個(gè)shell腳本一樣,其中也可以執(zhí)行操作系統(tǒng)的命令。makefi
12、le主要功能make工具最主要也是最基本的功能就是通過makefile文件來描述源程序之間的相互關(guān)系并自動(dòng)維護(hù)編譯工作。而makefile 文件需要按照某種語法進(jìn)行編寫,文件中需要說明如何編譯各個(gè)源文件并連接生成可執(zhí)行文件,并要求定義源文件之間的依賴關(guān)系。makefile 文件是許多編譯器-包括 windows nt 下的編譯器-維護(hù)編譯信息的常用方法,只是在集成開發(fā)環(huán)境中,用戶通過友好的界面修改 makefile 文件而已。自動(dòng)化編譯makefile帶來的好處就是“自動(dòng)化編譯”,一旦寫好,只需要一個(gè)make命令,整個(gè)工程完全自動(dòng)編譯,極大的提高了軟件開發(fā)的效率。make是一個(gè)命令工具,是一個(gè)
13、解釋makefile中指令的命令工具,一般來說,大多數(shù)的ide都有這個(gè)命令,比如:delphi的make,visual c+的nmake,linux下gnu的make??梢?,makefile都成為了一種在工程方面的編譯方法。2.1.5 makefile規(guī)則makefile中的規(guī)則是這樣的:target : dependencies command目標(biāo)(target)程序產(chǎn)生的文件,如可執(zhí)行文件和目標(biāo)文件;目標(biāo)也可以是要執(zhí)行的動(dòng)作,如“clean”。依賴(dependencies)是用來產(chǎn)生目標(biāo)的輸入文件,一個(gè)目標(biāo)通常依賴于多個(gè)文件。命令(command)是make執(zhí)行的動(dòng)作,一個(gè)可以有多個(gè)命令
14、,每個(gè)占一行。注意:每個(gè)命令行的起始字符必須為tab字符!有依賴關(guān)系規(guī)則中的命令通常在依賴文件變化時(shí)負(fù)責(zé)產(chǎn)生target文件,make執(zhí)行這些命令更新或產(chǎn)生target。規(guī)則可以沒有依賴關(guān)系,如包含target “clean”的規(guī)則。規(guī)則解釋如何和何時(shí)重做該規(guī)則中的文件,make根據(jù)依賴關(guān)系執(zhí)行產(chǎn)生或更新目標(biāo);規(guī)則也說明如何和何時(shí)執(zhí)行動(dòng)作。有的規(guī)則看起來很復(fù)雜,但都符合上述模式。makefile中的規(guī)則描述如何生成特定的文件,即規(guī)則的目標(biāo)。規(guī)則列出了目標(biāo)的依賴文件,指定生成或更新目標(biāo)的命令。規(guī)則的次序是不重要的,除非是確定缺省目標(biāo):缺省目標(biāo)是第一個(gè)makefile中的第一個(gè)規(guī)則;如果第一個(gè)規(guī)則
15、有多個(gè)目標(biāo),第一個(gè)目標(biāo)是缺省的。有兩個(gè)例外:以.開頭的目標(biāo)不是缺省目標(biāo);模式規(guī)則對(duì)缺省目標(biāo)沒有影響。通常我們所寫的地一個(gè)規(guī)則是編譯整個(gè)或makefile中指定的所有程序。2.1.6 makefile文件 main:main.o input.o chuti.ogcc main.o input.o chuti.o -o mainmain.o:main.c myhead.hgcc -c main.cinput.o:main.cgcc -c input.cchuti.o:main.cgcc -c chuti.c2.1.7 源程序#include #include void function( )int
16、 index,itest_total,n=200;int iflag,num1,num2,itotal,iarrsum200,iarranswer200,iarrop4;itotal=0;printf(請(qǐng)輸入題數(shù):n);scanf(%d,&itest_total);for(index=0;indexitest_total;index+)iflag=rand()%4+1;switch(iflag)case 1:num1=rand()%10;num2=rand()%10;iarrsumindex=num1+num2;printf(%d+%d=n,num1,num2);break;case 2:nu
17、m1=rand()%10;num2=rand()%10;iarrsumindex=num1-num2;printf(%d-%d=n,num1,num2);break;case 3:num1=rand()%10;num2=rand()%10;iarrsumindex=num1*num2;printf(%d*%d=n,num1,num2);break;case 4:num1=rand()%10;num2=rand()%10;iarrsumindex=num1/num2;printf(%d/%d=n,num1,num2);break;default:break;printf(依次輸入每題的答案:n)
18、;for(index=0;indexitest_total;index+)scanf(%d,&iarranswerindex);getchar();if(iarranswerindex=iarrsumindex)itotal+;printf(正確率:%f%n,100.0*(itotal*1.0)/itest_total);int main()char flag; /開始有一輪測試,以后根據(jù)用戶的輸入開始新一輪測試或結(jié)束測試; dofunction();printf(請(qǐng)輸入y表示開始新一輪測試,其他字母表示結(jié)束測試:n);scanf(%c,&flag);while(flag!= y); retu
19、rn 0; 2.1.8 試驗(yàn)過程及結(jié)果輸入題數(shù)5得到計(jì)算式輸入每題答案運(yùn)行結(jié)果輸入y重新開始,輸入其他字母結(jié)束。2.1.6結(jié)果分析這是一個(gè)小學(xué)數(shù)學(xué)運(yùn)算測試程序,要求完成 10 以內(nèi)的加減運(yùn)算。 能根據(jù)用戶 輸入的想要練習(xí)的題目數(shù)自行出題。用戶輸入答案后可以判斷正誤,并能給出算對(duì)及算錯(cuò)的題目數(shù),最后計(jì)算出分?jǐn)?shù)。同時(shí),對(duì)于用戶算錯(cuò)的題目會(huì)發(fā)出報(bào)警聲,提示用戶注意,同時(shí)給出正確結(jié)果。做完一次測試后用戶可決定是否繼續(xù)進(jìn)行下一次 測試。該程序基本實(shí)現(xiàn)了以上功能,且計(jì)算結(jié)果合理正確,滿足實(shí)驗(yàn)要求。任務(wù)二:linux下c語言設(shè)計(jì)簡單聊天程序2.2.1實(shí)驗(yàn)題目熟悉linux操作系統(tǒng)下最簡單實(shí)用的通信程序soc
20、ket.最好能全部完成,否則按照完成情況打分。2.2.2實(shí)驗(yàn)?zāi)康耐ㄟ^對(duì)socket的編寫,可以了解linux下最簡單實(shí)用的進(jìn)程通信方法,為后續(xù)信號(hào)燈、消息隊(duì)列等學(xué)習(xí)奠定基礎(chǔ)。2.2.3實(shí)驗(yàn)設(shè)備及環(huán)境硬件設(shè)備:pc機(jī)一臺(tái)軟件環(huán)境:安裝linux操作系統(tǒng),并安裝相關(guān)的程序開發(fā)環(huán)境,如c c+tshbsh等編程語言環(huán)境。2.2.4實(shí)驗(yàn)內(nèi)容及要求內(nèi)容:本課題是建立聊天通信模型:設(shè)計(jì)一個(gè)聊天室軟件。包括服務(wù)器端和客戶端。 主要功能為:、服務(wù)器端功能:初始化 socket, 創(chuàng)建服務(wù)器端。維護(hù)一個(gè)鏈表,保存所有用戶的 ip 地址、端口信息。接受用戶傳送來的聊天信息,然后向鏈表中的所用用戶轉(zhuǎn)發(fā)。接受用戶傳送
21、來的連接判斷命令,并向用戶發(fā)出響應(yīng)命令。、客戶端功能: 客戶端界面上的兩個(gè)文本框,一個(gè)用于顯示接受的聊天信息,一個(gè)用來接受用戶輸入的聊天信息。當(dāng)按下“發(fā)送”按鈕時(shí)將信息發(fā)送給服務(wù)器。要求:用c語言編程實(shí)現(xiàn)linux簡單的聊天室功能。用戶程序命名為client.c;服務(wù)器程序命名為server.c。綁定端口等信息見實(shí)驗(yàn)方法內(nèi)容,要求client可以通過socket連接server。在client,提示輸入服務(wù)器ip。若連接server 的socket建立成功,返回提示信息。client輸入的聊天內(nèi)容在client端(多個(gè)client端)和server端同時(shí)顯示。多個(gè)client可同時(shí)接入serv
22、er,進(jìn)入聊天室,最多支持20個(gè)client。client端輸入quit退出連接,server端提示client退出??蛇x擇使用多線程實(shí)現(xiàn)多客戶端。2.2.5實(shí)驗(yàn)方法內(nèi)容主要的常量變量客戶端:#define true 1#define port 5000int quit=0; /quit表示是否用戶確定退出服務(wù)器端:#define maxline 1000 /在一條消息中最大的輸出字符數(shù)#define listenq 20 /最大監(jiān)聽隊(duì)列#define port 5000 /監(jiān)聽端口#define maxfd 20 /最大的在線用戶數(shù)量void *get_client(void *); int
23、 i,maxi=-1;/maxi表示當(dāng)前client數(shù)組中最大的用戶的i值int clientmaxfd;主要模塊客戶端:int main(void)void *get_server(void* sockfd) /get_server函數(shù),用于接受服務(wù)器轉(zhuǎn)發(fā)的消息服務(wù)器端:int main() void *get_client(void *sockfd) /運(yùn)行g(shù)et_client函數(shù),處理用戶請(qǐng)求2.2.6代碼客戶端代碼#ifdef have_config_h#include #endif#include client.hint main(int argc, char *argv) int
24、cstcp,csudp,ccudp; int server_port=8000;/c-s tcp port int cc_port=5000;/c-c udp port struct hostent *hostptr = null; struct sockaddr_in cs_link = 0 ; struct sockaddr_in cc_link = 0 ; char hostname80 = ; char bufbufsize+1=; char *msg; char *s_addr = null; int recvn; int childpid; if (2 != argc) fprin
25、tf(stderr, usage: %s n, argv0); exit(1); s_addr = argv1; cstcp = tcpsocket(); gethostname(hostname, sizeof(hostname);/get local host createsockaddr(s_addr,&cs_link,server_port);/c-s connect(cstcp,(struct sockaddr*) &cs_link); msg=client opc 0.0.1n; send(cstcp,msg); recv(cstcp,buf); printf(%s,buf); p
26、rintf(connect to server successfully,please input your nicknamen); fgets(buf); send(cstcp,buf);/send user name bzero(buf,bufsize); recv(cstcp,buf); while(strncmp(buf,:x,2)=0) printf(%s,the name has been used,please change your name:n); fgets(buf); send(cstcp,buf);/send user name bzero(buf,bufsize);
27、recv(cstcp,buf); printf(%s,buf); send(cstcp,:l);/send com to get userlist form server printf(online users:n); bzero(buf,bufsize); recv(cstcp,buf);/get userlist from server printf(%s,buf); childpid = fork(); switch (childpid) case -1: / error perror(fork(); exit(1); case 0: / child process while(1) b
28、zero(buf,bufsize); if(recv(cstcp,buf)0) if(strncmp(buf,:q,2)=0) exit(0);/get userlist from server printf(%s,buf);服務(wù)器端代碼#include int tcpsocket() int n; if ( (n = socket(pf_inet,sock_stream,0)=-1) perror(tcp socket error); exit(1); return(n);void setsockopt(int s) int on = 1; struct linger linger = 0
29、; linger.l_onoff = 1; linger.l_linger = 30; if ( setsockopt(s, sol_socket, so_reuseaddr, (const char *) &on, sizeof(on)=-1) perror(setsockopt(.,so_reuseaddr,.); exit(1); if ( setsockopt(s, sol_socket, so_linger, (const char *) &linger, sizeof(linger)=-1) perror(setsockopt(.,so_linger,.); exit(1); in
30、t bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen) return bind(sockfd,my_addr,addrlen);void listen(int s)void gethostname(char *buffer, int length) struct utsname sysname = 0 ; int status = 0; status = uname(&sysname); if (-1 != status) strncpy(buffer, sysname.nodename, length); e
31、lse perror(gethostname(); exit(1); void createsockaddr(const char *hostname,struct sockaddr_in *sockaddress,int port) struct hostent *host = null; host = gethostbyname(hostname); if (null = host) host = gethostbyaddr(hostname, strlen(hostname), af_inet); (void) memset(sockaddress, 0, sizeof(sockaddr
32、ess); (void) memcpy(&(*sockaddress).sin_addr), host-h_addr, host-h_length); sockaddress-sin_addr.s_addr=htonl(inaddr_any); sockaddress-sin_family = af_inet; sockaddress-sin_port = htons(port);ssize_t send(int s, const void *buf) ssize_t sendn; if( -1=(sendn=send(s, buf, strlen(buf), 0) perror(send()
33、; close(s); return sendn;ssize_t recv(int s, void *buf)char *fgets(char *s) bzero(s,bufsize);void rtrim(char *buf) int i; for(i=0;i255;i+) if(bufi=n) bufi=0; break; 2.2.7實(shí)驗(yàn)過程服務(wù)器打開l客戶端打開,并輸入了地址,昵稱l 服務(wù)器端顯示l客戶端2進(jìn)入l服務(wù)器顯示l張三輸入l李四端顯示l服務(wù)器顯示l李四輸入l張三顯示服務(wù)器顯示2.2.8結(jié)果分析這是一個(gè)聊天室程序,可以實(shí)現(xiàn)群聊的功能,即當(dāng)某個(gè)客戶發(fā)出消息后,服務(wù)器和其他個(gè)客戶端都
34、能收到此消息。且能夠顯示客戶端的用戶名。但客戶端退出聊天室后,服務(wù)器和其他在線客戶端會(huì)有提示。實(shí)現(xiàn)群聊的機(jī)制是:當(dāng)某個(gè)客戶端需要發(fā)送消息是,它將此消息發(fā)送給服務(wù)器,服務(wù)器再將此消息轉(zhuǎn)發(fā)給各客戶端,各客戶端之間是無連接的,即相互之間不能直接通信。因此,在服務(wù)器中,有兩個(gè)線程,主線程用來監(jiān)聽是否有客戶端登錄服務(wù)器,若有,建立與其連接的套接字,并存入在線客戶序列里,輔助線程是接收轉(zhuǎn)發(fā)線程,其依次讀取個(gè)客戶端,看是否有消息送達(dá),若有取出,并轉(zhuǎn)發(fā)給各其他客戶端。在客戶端也有兩個(gè)線程,主線程用來向服務(wù)器發(fā)送消息,輔助線程用來接收服務(wù)器發(fā)出的消息。存在的問題是:當(dāng)有用戶下線是,雖會(huì)在服務(wù)器和各客戶端提示用戶下線,但是并未刪除其在服務(wù)器中的套接字,致使后來用戶不能進(jìn)入。服務(wù)器的輔助線程對(duì)各客戶端采取輪流監(jiān)聽的策略,但是因?yàn)槭褂胷ea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 年中國燃?xì)庹{(diào)壓器市場調(diào)研及行業(yè)統(tǒng)計(jì)數(shù)據(jù)分析報(bào)告
- 學(xué)雷鋒團(tuán)委活動(dòng)策劃方案
- 2025年采購人員述職報(bào)告范例(六)
- 兒童線上教育課件
- 2025-2030年中國板鏈?zhǔn)捷斔蜋C(jī)項(xiàng)目投資可行性研究分析報(bào)告
- 幼兒園中秋節(jié)親子的活動(dòng)方案
- 小紅書引流方案
- 某項(xiàng)大棚蔬菜種植的調(diào)研報(bào)告
- 2025年中國觸摸顯示屏行業(yè)投資分析及發(fā)展戰(zhàn)略咨詢報(bào)告
- 活潑有趣的端午節(jié)教學(xué)活動(dòng)方案范本
- 腦血管病防治指南(2024年版)完整版
- 消化道穿孔護(hù)理
- TYCST 004-2024 透水水泥穩(wěn)定碎石基層 透水系數(shù)的測定
- 部門級(jí)安全培訓(xùn)試題加解析答案可打印
- 醫(yī)學(xué)教材 暴發(fā)性心肌炎
- 車間6S可視化管理之定置劃線標(biāo)準(zhǔn)解讀
- 小學(xué)英語三年級(jí)《My Family》說課課件
- Odoo:Odoo集成與第三方應(yīng)用技術(shù)教程.Tex.header
- 2024年江西省“振興杯”地質(zhì)調(diào)查員競賽考試題庫(含答案)
- 人教部編版九年級(jí)歷史上冊(cè):第14課 文藝復(fù)興運(yùn)動(dòng) 教學(xué)設(shè)計(jì)
- 機(jī)械設(shè)備賠償協(xié)議
評(píng)論
0/150
提交評(píng)論