版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
(此文檔為w?ord格式?,下載后您可?任意編輯修?改!)《UNIX系?統(tǒng)與軟件開?發(fā)》課程設(shè)計說明書設(shè)計題目:圖書管理系?統(tǒng)專業(yè):計算機科學(xué)?與技術(shù)指導(dǎo)教師:班級:學(xué)號:姓名:同組人:計算機科學(xué)?與工程學(xué)院?2014年6月18日前言在信息技術(shù)?發(fā)展迅猛的?二十一世紀(jì)?的今天,我們需要掌?握的不僅僅?是科學(xué)文化?知識,還需要把所?學(xué)到的知識?合理的運用?到現(xiàn)實生活?中來??茖W(xué)技術(shù)是?第一生產(chǎn)力?,它給我們帶?來的不僅僅?是生活中的?各種便利和?生活水平的?不斷提高,同時也給帶?給了我們各?種各樣的不?同類型和不?同層次的科?技的領(lǐng)先發(fā)?展的成果。在中間件誕?生之前,多采用傳統(tǒng)?CS二層結(jié)?構(gòu)。這種二層結(jié)?構(gòu)是計算機?及軟件技術(shù)?發(fā)展的一大?進步。一般而言,服務(wù)器是一?個進程,它等待客戶?機與其聯(lián)系?,提出某種類?型的服務(wù)要?求。CS模式在?操作過程中?采取的是主?動請求方式?。服務(wù)對客戶?機服務(wù)可將?結(jié)果或信息?返回給客戶?機(雙向),也可不返回?(單向)。雖然它帶來?了相當(dāng)?shù)撵`?活性,但也逐漸暴?露出其客戶?端和服務(wù)器?端負(fù)擔(dān)過重?的現(xiàn)象,并且拓展性?也較差,無法跨越不?同的業(yè)務(wù)部?門和業(yè)務(wù)系?統(tǒng)。這不僅表現(xiàn)?在技術(shù)上有?難度,更重要的是?在制度和安?全方面。于是,三層結(jié)構(gòu)出?現(xiàn)了所謂三層結(jié)?構(gòu),就是在原有?的兩層結(jié)構(gòu)?之間,增加一個中?間層。該中間層既?包括服務(wù)也?包括請求中間件是一?種獨立的系?統(tǒng)軟件或服?務(wù)程序,分布式應(yīng)用?軟件借助這?種軟件在不?同的技術(shù)之?間共享資源?。中間件位于?客戶機服務(wù)器的操?作系統(tǒng)之上?,管理計算資?源和網(wǎng)絡(luò)通?訊。是連接兩個?獨立應(yīng)用程?序或獨立系?統(tǒng)的軟件。相連接的系?統(tǒng),即使它們具?有不同的接?口,但通過中間?件相互之間?仍能交換信?息。執(zhí)行中間件?的一個關(guān)鍵?途徑是信息?傳遞。通過中間件?,應(yīng)用程序可?以工作于多?平臺或OS環(huán)境。它的工作機?制是:當(dāng)客戶端上?的應(yīng)用程序?需要從網(wǎng)絡(luò)?中某個節(jié)點?處獲取一定?的數(shù)據(jù)或服?務(wù)時,這些數(shù)據(jù)和?服務(wù)可能處?于一個運行?著和客戶端?不同的硬、軟件、網(wǎng)絡(luò)或操作?系統(tǒng)的平臺?上。CS應(yīng)用程?序中負(fù)責(zé)尋?找數(shù)據(jù)的部?分只需訪問?一個中間件?系統(tǒng),由中間件完?成到網(wǎng)絡(luò)中?找到數(shù)據(jù)源?或服務(wù),進而實現(xiàn)傳?輸客戶請求?、重組答復(fù)信?息,最后將結(jié)果?送回應(yīng)用程?序的任務(wù)。本次設(shè)計的?中間件是交?易型中間件?。交易型中間?件是指用在?不同行業(yè)、不同部門間?的通訊轉(zhuǎn)發(fā)?和協(xié)議轉(zhuǎn)換?的軟件,在不同的行?業(yè)、不同的系統(tǒng)?間提供通訊?轉(zhuǎn)發(fā)和協(xié)議?轉(zhuǎn)換的橋梁?作用。本次設(shè)計不?是基于WE?B的,不需要很多?與WEB開?發(fā)相關(guān)的知?識,主要是利用?UNIX系?統(tǒng)提供的S?ocket?庫在網(wǎng)絡(luò)底?層,開發(fā)交易型?中間件。本次設(shè)計的?目的是掌握?利用軟件工?程的思想方?法和TCP?IP設(shè)計出?用于不同行?業(yè)和部門間?的通訊轉(zhuǎn)發(fā)?或協(xié)議轉(zhuǎn)換?軟件—中間件,尤其掌握這?種設(shè)計的思?想和方法。目錄TOC\o"1-3"\h\u一、系統(tǒng)環(huán)境 11、硬件環(huán)境 12、軟件環(huán)境 1二、設(shè)計目的及?要求 22.1設(shè)計目的? 22.2設(shè)計要求? 2三、總體設(shè)計 43.1程序設(shè)計?組成框圖 43.2程序設(shè)計?類圖 53.3程序設(shè)計?流程圖 6四、詳細(xì)設(shè)計 74.1基本套接?字系統(tǒng)調(diào)用? 74.2MySQL?數(shù)據(jù)庫在U?nix的使?用 8? 8MySQL?服務(wù)配置 9MySQL?客戶端命令?行工具 9?行 9MySQL?開發(fā)接口 9五、調(diào)試與測試? 115.1調(diào)試方法? 115.2測試結(jié)果?分析及討論? 11六、設(shè)計中遇到?的問題及解?決方法 22七、源程序清單? 237.1數(shù)據(jù)庫代?碼 237.2服務(wù)器代?碼 247.3中間件程?序 337.4客戶端程?序 36八、心得體會 57九、參考文獻 58一、系統(tǒng)環(huán)境1、硬件環(huán)境Penti?um(R),4cpu3.06GHz?,512MB?內(nèi)存。2、軟件環(huán)境該圖書管理?系統(tǒng)是在w?indow?sXP操作系?統(tǒng)下使用L?inux虛?擬機環(huán)境,使用GNU?C,在UNIX?Linux?make開?發(fā)工具的管?理和控制下?,利用UNI?XLinu?xSocke?t庫和My?SQL數(shù)據(jù)?庫在網(wǎng)絡(luò)的?底層進行開?發(fā)設(shè)計的。二、設(shè)計目的及?要求2.1設(shè)計目的?基于UNI?XSocke?t和MyS?QL數(shù)據(jù)庫?,設(shè)計一個交?易型中間件?系統(tǒng)。這里的中間?件是指交易?型中間件。交易型中間?件是指用在?不同行業(yè)、不同部門間?的通訊轉(zhuǎn)發(fā)?和協(xié)議轉(zhuǎn)換?的軟件,在不同的行?業(yè)、不同的系統(tǒng)?間提供通訊?轉(zhuǎn)發(fā)和協(xié)議?轉(zhuǎn)換的橋梁?作用。例如電子商?務(wù)、銀行代理業(yè)?務(wù)軟件等都?是這種類型?的軟件。本設(shè)計不是?基于WEB?的,不需要很多?與WEB開?發(fā)相關(guān)的知?識,主要是利用?UNIX系?統(tǒng)提供的S?ocket?庫在網(wǎng)絡(luò)底?層,開發(fā)交易型?中間件。本設(shè)計的目?的是使參與?設(shè)計者掌握?利用軟件工?程的思想方?法和TCP?IP設(shè)計出?用于不同行?業(yè)和部門間?的通訊轉(zhuǎn)發(fā)?或協(xié)議轉(zhuǎn)換?軟件—中間件,尤其掌握這?種設(shè)計的思?想和方法。在很多場合?中間件部分?是必須的,因為在不同?的行業(yè)的網(wǎng)?絡(luò)是不允許?直通的。這里有政策?的因素,有制度的要?求,也有技術(shù)的?成份。2.2設(shè)計要求?(1)客戶端客戶端程序?可命名為c?lient?,要求帶有兩?個命令行參?數(shù)一個是服?務(wù)(自己定義,并保存在e?tcser?vices?中,比如mys?vr15678),另一個是目?的主機(自己定義,并保存在e?tc,inttype,intproto?col);該調(diào)用要接?收3個參數(shù)?,根據(jù)這3個?參數(shù)建立一?個套接字,并將相應(yīng)的?資源分配給?它,同時返回一?個整型套接?字號,只和一個特?定的協(xié)議相?聯(lián)系。實際上指定?了相關(guān)五元?組中的“協(xié)議”這一元。domai?n(協(xié)議族):AF_IN?ET,AF_UN?IX,AF_IP?Xtype(類型):SOCK_?STREA?M,SOCK_?DGRAM?proto?col(協(xié)議):0-讓系統(tǒng)使用?指定類型和?協(xié)議族上的?默認(rèn)協(xié)議?!?】綁定本地地?址—bind()當(dāng)一個套接?字用soc?ket()創(chuàng)建后,存在一個名?字空間(地址族),但它沒有被?命名,bind()將套接字地?址(包括本地主?機地址和本?地端口地址?)與所創(chuàng)建的?套接字號綁?定起來,即將名字賦?予套接字,以指定本地?半相關(guān)。其調(diào)用格式?如下:#inclu?de <sysso?cket.);說明:sockf?d:為sock?et成功時?的返回值—套接字描述?符。my_ad?dr為本方?地址數(shù)據(jù)結(jié)?構(gòu)。addrl?en=sizeo?f(my_ad?dr).【3】監(jiān)聽連接—liste?n()此調(diào)用用于?面向連接服?務(wù)器,表明它愿意?接收連接。1iste?n()需在acc?ept()之前調(diào)用,其調(diào)用格式?如下:#inclu?de <sysso?cket.(ints,intbackl?og);liste?n()在執(zhí)行調(diào)用?過程中可為?沒有調(diào)用過?bind()的套接字s?完成所必需?的連接,并建立長度?為back?log的請?求連接隊列?。backl?og定義最?大長度的s?ocket?等待隊列。默認(rèn)值為5?.【4】conne?ct(),accep?t()這兩個系統(tǒng)?調(diào)用用于完?成一個完整?相關(guān)的建立?,其中con?nect()用于客戶建?立連接。accep?t()用于使服務(wù)?器等待來自?某客戶進程?的實際連接?。=1\*GB3①conne?ct功能:客戶方調(diào)用?發(fā)出的請求?用法:intconne?ct(intsockf?d,const?struc?tctsocka?ddr*serve?r_add?r,sockl?en_taddrl?en);在面向連接?的協(xié)議中,該調(diào)用導(dǎo)致?本地系統(tǒng)和?外部系統(tǒng)之?間連接實際?建立。=2\*GB3②accep?t服務(wù)器調(diào)用?,從等待從編?號為s的套?接字上接受?客戶連接請?求用法:intaccep?t(ints,struc?tsocka?ddr*addr,sockl?en_taddrl?en);=3\*GB3③conne?ct與ac?cept的?說明調(diào)用acc?ept()后,服務(wù)器等待?從編號為s?的套接字上?接受客戶連?接請求,連接請求是?由客戶方的?conne?ct()調(diào)用發(fā)出的?。當(dāng)有連接請?求到達時,accep?t()調(diào)用將請求?連接隊列上?的第一個客?戶方套接字?地址及長度?放入add?r和add?rlen,并創(chuàng)建一個?與s有相同?特性的新套?接字號。新的套接字?可用于處理?服務(wù)器并發(fā)?請求?!?】數(shù)據(jù)傳輸:send()write?與recv?()read()當(dāng)一個連接?建立以后,就可以傳輸?數(shù)據(jù)了。常用的系統(tǒng)?調(diào)用有se?nd()和recv?()。send()調(diào)用用于在?參數(shù)s指定?的已連接的?數(shù)據(jù)報或流?套接字上發(fā)?送輸出數(shù)據(jù)?,格式如下:intsend(ints,void*buf,intlen,intflags?);intrecv(ints,void*buf,intlen,intflags?);recvs?end可由?文件系統(tǒng)調(diào)?用read?write?所取代。在處理二進?制數(shù)據(jù)處理?時,后者優(yōu)于前?者。【6】關(guān)閉套接字?:close?()close?()關(guān)閉套接字?s,并釋放分配?給該套接字?的資源;如果s涉及?一個打開的?TCP連接?,則該連接被?釋放。close?()的調(diào)用格式?如下:intclose?(ints);4.2MySQL?數(shù)據(jù)庫在U?nix的使?用?1)MySql?服務(wù)器2)MySql?客戶端3)MySql?開發(fā)接口庫?MySQL?服務(wù)配置◆mysqy?ld服務(wù)要?運行起來。最好是設(shè)為?開機自動啟?動。方法:◆chkco?nfig–level?2345mysql?don◆ntsys?v◆servi?cemysql?dstart?stopresta?rt◆圖形方式MySQL?客戶端命令?行工具MySqy?l客戶端命?令行工具為?mysql?。其常用法為?:mysql?[OPTIO?NS][datab?ase]<scrip?t.sql>outpu?t.tab常用參數(shù)有?:-?,--");保存結(jié)果resul?t=mysql?_stor?e_res?ult(&mysql?);◆處理結(jié)果集?while?((row=mysql?_fetc?h_row?(resul?t))){ fprin?tf(stdou?t,"%s|\t%s\n",row[0],row[2]); }mysql?_free?_resu?lt(resul?t);清理數(shù)據(jù)mysql?_clos?e(&mysql?);關(guān)閉連接}◆編譯和鏈接?方法編譯鏈接時?要使用-L和-l參數(shù)例如:cc-omysql?mysql?.c -Lusrl?ibmys?ql-lmysq?lclie?nt五、調(diào)試與測試?5.1調(diào)試方法?1)安裝組件:rpm–ivhmysql?-devel?*.rpm2)增加服務(wù):vietcse?rvice?sS11245t?cpS21246t?cp3)連接數(shù)據(jù)庫?:mysql?–uroot<mysql?.scrip?t4)運行服務(wù)器?:cc-oserve?rserve?r.c-Lusrl?ibmys?ql-lmysq?lclie?nt.serve?rs15)運行中間件?:cc–omiddl?emiddl?e.c.middl?es2s1local?host6)運行客戶端?:cc–oclien?tclien?t.c.clien?ts2local?host5.2測試結(jié)果?分析及討論?1)MySQL?數(shù)據(jù)庫的相?關(guān)截圖編寫mys?ql.scrip?t腳本文件?,在文件中編?寫創(chuàng)建數(shù)據(jù)?庫libr?ary,在該數(shù)據(jù)庫?下創(chuàng)建ad?mi、books?、borro?w、test表?,并插入相應(yīng)?的數(shù)據(jù),具體內(nèi)容如?下圖所示。:數(shù)據(jù)庫li?brary?中的相關(guān)表?,如圖所示:服務(wù)器通信?過程中如圖?圖4)運行客戶端?程序cli?ent.c,如圖5.2.7所示:圖5.2.75)實現(xiàn)查詢圖?書功能6)實現(xiàn)用戶登?錄功能,且實現(xiàn)了密?碼不回顯功?能,圖9)實現(xiàn)用戶還?10)實現(xiàn)用戶續(xù)?11)實現(xiàn)用戶注?12)實現(xiàn)管理員?登錄,且實現(xiàn)了密?碼不回顯功?13)實現(xiàn)管理員?查詢圖書功?14)實現(xiàn)管理員?增加圖書功?15)實現(xiàn)管理員?刪除圖書功?刪除圖書b?ook10?后再查詢改?圖書,提示“未找到該圖?書”,說明確實刪?16)實現(xiàn)管理員?六、設(shè)計中遇到?的問題及解?決方法這是我們第?一次學(xué)習(xí)關(guān)?于中間件的?知識,對它的具體?運行只是有?一定程度的?了解,不是很深刻?,在設(shè)計中由?于對UNI?X知識的掌?握不好,導(dǎo)致初期進?度是相當(dāng)?shù)?慢,在開始的幾?天里差不多?就沒有什么?進度,后來通過我?們小組成員?的討論、不斷查閱資?料及向老師?請教,我們開始有?了一點點的?設(shè)計思路,設(shè)計過程中?用到的知識?不單單是課?本上有的,還有的是課?本上沒介紹?過的,因此這就需?要我們多方?的查閱資料?和向老師請?教。平時我們都?習(xí)慣了使用?Windo?ws的編輯?器,開始的時候?由于UNI?X的文檔編?輯和Win?dows有?著很大的區(qū)?別,UNIX是?全字符編輯?器,所以在初期?使用UNI?X進行的編?輯的時候有?點不知道該?從那下手,后來經(jīng)過學(xué)?習(xí)知道在其?編輯過程中?我們可以使?用終端通過?命令來實現(xiàn)?。還有在數(shù)據(jù)?庫的建立中?,由于其基本?程序中不帶?有數(shù)據(jù)庫,一次我們必?須自己建立?一個數(shù)據(jù)庫?來存儲信息?,但是我們不?知道怎樣在?客戶端和主?機程序中插?入數(shù)據(jù)庫,以此來存儲?圖書信息,在指導(dǎo)老師?和同學(xué)的幫?助下,還有借助網(wǎng)?絡(luò)查了一些?資料后終于?解決了這一?問題,等等。在編寫好程?序后,發(fā)現(xiàn)在管理?員增加圖書?模塊,只能連續(xù)的?增加圖書,不能退出該?選項。在仔細(xì)研究?代碼后,我在管理員?增加圖書的?代碼后添加?了brea?k語句,成功的解決?了錯誤。其次原先若?輸入比菜單?中選項大的?數(shù)字,系統(tǒng)沒有識?別錯誤,繼續(xù)執(zhí)行。為了解決這?個錯誤,我在客戶端?的主菜單部?分添加了i?f-else語?句,對字符進行?判斷和錯誤?處理,成功的解決?了該錯誤。其實設(shè)計中?遇到的問題?遠(yuǎn)比這多很?多,因為掌握知?識的程度不?同,各種各樣的?編程問題都?會遇到,我們堅持不?懈,通過不斷的?學(xué)習(xí)和查閱?資料、向老師請教?,最后通過努?力完成了任?務(wù)。七、源程序清單?7.1數(shù)據(jù)庫代?碼編寫腳本文?件mysq?l.scrip?t,并在腳本中?編寫如下內(nèi)?容:creat?edatab?aselibra?ry;uselibra?ry;creat?etable?books?(idchar(10)notnullprima?rykey,namechar(50)notnull,write?rchar(50),stora?gechar(10));creat?etable?reade?r(idchar(10)notnullprima?rykey,namechar(50)notnull,passw?ordchar(15),enabl?echar(2)defau?lt"1");creat?etable?admi(idchar(10)notnullprima?rykey,namechar(50)notnull,passw?ordchar(15));creat?etable?borro?w(r_idchar(10)notnull,b_idchar(10)notnull,b_dat?edate,statu?schar(2),prima?rykey(b_id,r_id),forei?gnkey(b_id)refer?ences?books?(id)ondelet?ecasca?deonupdat?ecasca?de,forei?gnkey(r_id)refer?ences?reade?r(id)ondelet?ecasca?deonupdat?ecasca?de);inser?tintobooks?value?s("1","book1?","a","5");inser?tintobooks?value?s("2","book2?","b","6");inser?tintobooks?value?s("3","book3?","c","6");inser?tintobooks?value?s("4","book4?","d","10");inser?tintobooks?value?s("5","book5?","e","9");inser?tintobooks?value?s("6","book6?","f","4");inser?tintobooks?value?s("7","book7?","g","7");inser?tintoreade?rvalue?s("00000?","youke?","123","1");inser?tintoadmivalue?s("11111?","root","123");7.2服務(wù)器代?碼#inclu?de<stdio?..=0;temp=(char*)mallo?c(strle?n(buf));strcp?y(temp,buf);p=temp;strto?k_r(temp,";",&op);while?((tmp=strto?k_r(NULL,";",&op))!=NULL){p=tmp;while?((tmp=strto?k_r(p,",",&ip))!=NULL){strcp?y(resul?t[i][j],tmp);p=NULL;j++;}i++;j=0;}free(temp);}intopdb(char*cmd,char*p,intflag)opera?tedatab?ase{MYSQL?mysql?;MYSQL?_RES*resul?t;MYSQL?_ROWrow;inti,j,n=0;charbuf[256];if(mysql?_init?(&mysql?)==NULL){print?f("dbiniterror?!\n");retur?n-1;}print?f("Initdbsucce?ssful?ly!\n");if(!mysql?_real?_conn?ect(&mysql?,"local?host","root",0,"libra?ry",0,NULL,0)){print?f("Conne?cterror?!\n");mysql?_clos?e(&mysql?);retur?n-1;}print?f("Conne?ctdbsucce?ssful?ly!\n");print?f("cmd=%s\n",cmd);if(mysql?_quer?y(&mysql?,cmd)!=0){print?f("query?datab?asewrong?!\n");mysql?_clos?e(&mysql?);retur?n-1;}if(flag==1){print?f("bbbbb?bbbbb?bbb\n");if((resul?t=mysql?_stor?e_res?ult(&mysql?))==NULL){mysql?_free?_resu?lt(resul?t);mysql?_clos?e(&mysql?);retur?n-1;}n=mysql?_num_?rows(resul?t);}i=0;j=0;if(p!=NULL){bzero?(buf,sizeo?f(buf));while?((row=mysql?_fetc?h_row?(resul?t))){strca?t(buf,";");strca?t(buf,row[0]);for(i=1;i<mysql?_num_?field?s(resul?t);i++){strca?t(buf,",");strca?t(buf,row[i]);}}sprin?tf(p,"%d%s",n,buf);}if(flag==1){print?f("aaaaa?aaaaa?aaaaa?aaaaa?a\n");mysql?_free?_resu?lt(resul?t);}mysql?_clos?e(&mysql?);print?f("opdbsucce?ssful?ly!\n");print?f("n=%d\n",n);retur?nn;}check?stat(charid[]){charcmd1[128],cmd2[128],cmd[128],buf[10];sprin?tf(cmd1,"selec?t*fromborro?wwhere?to_da?ys(now())-to_da?ys(b_dat?e)>30&&r_id=\"%s\"",id);sprin?tf(cmd2,"selec?t*fromborro?wwhere?r_id=\"%s\"",id);if((opdb(cmd1,NULL,1)==0)&&(opdb(cmd2,NULL,1)<4)){sprin?tf(cmd,"updat?ereade?rsetenabl?e=\"1\"where?id=\"%s\"",id);opdb(cmd,NULL,0);}else{sprin?tf(cmd,"updat?ereade?rsetenabl?e=\"0\"where?id=\"%s\"",id);opdb(cmd,NULL,0);}print?f("Check?ok!\n");}main(intargc,char**argv){struc?tsocka?ddr_i?nsin;struc?tserve?nt*sp;ints,ns,pid;charbuf[1024];char*servi?ce;if(argc!=1)servi?ce=argv[1];else{fprin?tf(stder?r,"NOservi?ceassig?ned!\nUsag?e:\n");fprin?tf(stder?r,"\t%sserve?r_nam?e!\n",argv[0]);fprin?tf(stder?r,"Note:serve?r_nam?eisdefin?edinfileetcse?rvice?s\n");exit(-1);}if((sp=getse?rvbyn?ame(servi?ce,"tcp"))==NULL){fprin?tf(stder?r,"Error?:getse?rvbyn?ame");exit(-5);}if((s=socke?t(AF_IN?ET,SOCK_?STREA?M,0))==-1){fprin?tf(stder?r,"Error?:socke?tcreat?e");exit(-6);}bzero?(&sin,sizeo?f(sin));sin.sin_p?ort=sp->s_por?t;if(bind(s,(struc?tsocka?ddr*)&sin,sizeo?f(sin))==-1){fprin?tf(stder?r,"Error?:bind");close?(s);exit(-6);}if(liste?n(s,5)==-1){fprin?tf(stder?r,"Error?:liste?n");close?(s);exit(-6);}while?(1){fprin?tf(stder?r,"\n\t\t\tNowwaitconne?ct...\n");if((ns=accep?t(s,0,0))==-1){waitaconne?ction?*fprin?tf(stder?r,"error?:accep?t");conti?nue;}if((pid=fork())==-1){conne?ted,andthencreat?echild?procfprin?tf(stder?r,"serve?r:forkerror?!");close?(s);exit(-1);}if(pid!=0){paren?tproce?,nothi?ngtodo,andtothenextloopclose?(ns);wait(0);conti?nue;}if(pid==0){enter?edchild?procc?edure?close?(s);print?f("Recei?veaclien?tconne?ct:\n");MYSQL?mysql?;MYSQL?_RES*resul?t;MYSQL?_ROWrow;charcmd[128],buf[128];char*info[3];charname[50],write?r[50];charid[50],passw?ord[50];charrec[10][10][50];char*b_id,*r_id;intn;chartmp[10][10][50];while?(1){n=0;bzero?(name,sizeo?f(name));bzero?(id,sizeo?f(id));bzero?(passw?ord,sizeo?f(passw?ord));bzero?(write?r,sizeo?f(write?r));bzero?(rec,sizeo?f(rec));bzero?(tmp,sizeo?f(tmp));print?f("******************************************************************\n");if((n=read(ns,buf,sizeo?f(buf)))<=0){print?f("readwrong?!\n");break?;}buf[n]='\0';print?f("recei?vemessa?ge:%s\n",buf);if(strcm?p(buf,"over")==0){print?f("Close?dbyClien?t\n");break?;}if(buf[1]==';'){switc?h(buf[0]) {case'c':updat?euserinfogetm(buf,rec);check?stat(rec[0][0]);sprin?tf(cmd,"selec?t*fromreade?rwhere?id=\"%s\"",rec[0][0]);n=opdb(cmd,buf,1);print?f("useri?nfo=%s\n",buf);if((write?(ns,buf,sizeo?f(buf)))<=0) {print?f("Write?socke?twrong?!\n");break?; }break?;case'q':Query?getm(buf,rec);print?f("buf=%s\n",buf);sprin?tf(cmd,"selec?t*frombooks?where?namelike\"%s%\"",rec[0][0]);n=opdb(cmd,buf,1);print?f("Reply?:%s\n",buf);if((write?(ns,buf,sizeo?f(buf)))<=0){print?f("Write?socke?twrong?!\n");break?; }break?;case'l':getm(buf,rec);check?stat(rec[0][0]);sprin?tf(cmd,"selec?t*fromreade?rwhere?id=\"%s\"&&passw?ord=\"%s\"",rec[0][0],rec[0][1]);opdb(cmd,buf,1);print?f("reply?:%s\n",buf);if((write?(ns,buf,strle?n(buf)))<=0){print?f("Write?socke?terror?!\n");break?; }print?f("Login?\n");break?;case'L':getm(buf,rec);sprin?tf(cmd,"selec?t*fromadmiwhere?id=\"%s\"&&passw?ord=\"%s\"",rec[0][0],rec[0][1]);opdb(cmd,buf,1);print?f("reply?:%s\n",buf);if((write?(ns,buf,strle?n(buf)))<=0) {print?f("Write?socke?terror?!\n");break?; }print?f("Login?\n");break?;case'b':getm(buf,rec);sprin?tf(cmd,"selec?t*fromborro?wwhere?r_id=\"%s\"&&b_id=\"%s\"",rec[0][0],rec[0][1]);if(opdb(cmd,NULL,1)!=0) {print?f("Haveborro?wed!\n");buf[0]='1';buf[1]='\0';if((write?(ns,buf,strle?n(buf)))<=0) {print?f("Write?socke?terror?!\n");break?; }break?; }sprin?tf(cmd,"selec?t*frombooks?where?id=\"%s\"&&stora?ge=\"0\"",rec[0][1]);if(opdb(cmd,NULL,1)!=0) {buf[0]='2';if((write?(ns,buf,strle?n(buf)))<=0){print?f("Write?socke?terror?!\n");break?; }break?; }print?f("tmp=%s,%s\n",tmp[0][0],tmp[0][3]);print?f("rec=%s,%s\n",rec[0][0],rec[0][1]);bzero?(cmd,sizeo?f(cmd));sprin?tf(cmd,"inser?tintoborro?wvalue?s(\"%s\",\"%s\",now(),\"1\")",rec[0][0],rec[0][1]);opdb(cmd,NULL,0);bzero?(cmd,sizeo?f(cmd));sprin?tf(cmd,"updat?ebooks?setstora?ge=stora?ge-1where?id=\"%s\"",rec[0][1]);opdb(cmd,write?r,0);buf[0]='0';buf[1]='\0';if((write?(ns,buf,strle?n(buf)))<=0){print?f("Write?socke?terror?!\n");break?; }print?f("Borro?wsucce?ssful?ly!\n");break?;case'r':getm(buf,rec);print?f("Oneretur?nreque?st!\n");sprin?tf(cmd,"selec?tborro?w.b_id,books?.namefromborro?w,books?where?borro?w.b_id=books?.id&&borro?w.r_id=\"%s\"",rec[0][0]);opdb(cmd,buf,1);print?f("buf=%s\n",buf);n=write?(ns,buf,strle?n(buf));if(n<=0) {print?f("write?error?!\n");break?; }print?f("sendn=%d\n",n);break?;case'R':getm(buf,rec);sprin?tf(cmd,"delet?efromborro?wwhere?r_id=\"%s\"&&b_id=\"%s\"",rec[0][0],rec[0][1]);opdb(cmd,buf,0);sprin?tf(cmd,"updat?ebooks?setstora?ge=stora?ge+1where?id=\"%s\"",rec[0][1]);opdb(cmd,buf,0);check?stat(rec[0][0]);buf[0]='0';if(write?(ns,buf,strle?n(buf))<=0){print?f("Write?wrong?!\n");exit(-1); }break?;case'm':getm(buf,rec);print?f("Onemoret?imereque?st!\n");sprin?tf(cmd,"selec?tborro?w.b_id,books?.name,borro?w.b_dat?e,date_?add(borro?w.b_dat?e,inter?val30day),borro?w.statu?sfromborro?w,books?where?borro?w.b_id=books?.id&&borro?w.r_id=\"%s\"",rec[0][0]);opdb(cmd,buf,1);print?f("buf=%s\n",buf);n=write?(ns,buf,strle?n(buf));if(n<=0){print?f("write?error?!\n");break?;}print?f("sendn=%d\n",n);break?;case'M':getm(buf,rec);sprin?tf(cmd,"updat?eborro?wsetstatu?s=\"0\"where?r_id=\"%s\"&&b_id=\"%s\"",rec[0][0],rec[0][1]);opdb(cmd,buf,0);sprin?tf(cmd,"updat?eborro?wsetb_dat?e=date_?add(b_dat?e,inter?val30day)where?r_id=\"%s\"&&b_id=\"%s\"",rec[0][0],rec[0][1]);opdb(cmd,buf,0);check?stat(rec[0][0]);buf[0]='0';if(write?(ns,buf,strle?n(buf))<=0){print?f("Write?wrong?!\n");exit(-1); }break?;case'a':getm(buf,rec);sprin?tf(cmd,"selec?t*frombooks?where?id=\"%s\"",rec[0][0]);if(opdb(cmd,buf,1)!=0){if(write?(ns,buf,strle?n(buf))<=0) {print?f("Write?wrong?!\n");break?; }break?; }sprin?tf(cmd,"inser?tintobooks?value?s(\"%s\",\"%s\",\"%s\",\"%s\")",rec[0][0],rec[0][1],rec[0][2],rec[0][3]);opdb(cmd,buf,0);buf[0]='0';if(write?(ns,buf,strle?n(buf))<=0) {print?f("Write?wrong?!\n");exit(-1); }break?;case'd':getm(buf,rec);print?f("Onedelreque?st!\n");sprin?tf(cmd,"selec?t*frombooks?");opdb(cmd,buf,1);n=write?(ns,buf,strle?n(buf));if(n<=0){print?f("write?error?!\n");break?; }print?f("buf=%s\n",buf);print?f("sendn=%d\n",n);break?;case'D':getm(buf,rec);sprin?tf(cmd,"delet?efrombooks?where?id=\"%s\"",rec[0][0]);opdb(cmd,buf,0);buf[0]='0';if(write?(ns,buf,strle?n(buf))<=0) {print?f("Write?wrong?!\n");break?; }break?;defau?lt:break?;}}}close?(ns);exit(0);}}}7.3中間件程?序#inclu?de<stdio?..(intargc,char**argv){struc?turedefin?edforreque?stasaclien?tstruc?tsin1;struc?tserve?nt*sp1;charsbuf[128];intss,spid;char*sserv?ice,*sdest?;struc?turedefin?edforreque?stasaserve?rstruc?tsocka?ddr_i?nsin;struc?tserve?nt*sp;ints,ns,pid,n;charbuf[128];char*servi?ce;testtheenvir?onmen?tparam?eter:lserv?ice,dserv?ice,serve?r_nam?eif(argc==4){servi?ce=argv[1];sserv?ice=argv[2];sdest?=argv[3];}else{fprin?tf(stder?r,"Param?eterassig?nedError?!\nUsag?e:\n");fprin?tf(stder?r,"\t%slserv?icedserv?iceserve?r_nam?e!\n",argv[0]);fprin?tf(stder?r,"Note:serve?r_nam?eisdefin?edinfileetc");fprin?tf(stder?r,"and:lserv?icedserv?icearedefin?edinfileetcse?rvice?s\n");exit(-1);}if((sp=getse?rvbyn?ame(servi?ce,"tcp"))==NULL){fprin?tf(stder?r,"Error?:getse?rvbyn?ame");exit(-5);}if((s=socke?t(AF_IN?ET,SOCK_?STREA?M,0))==-1){fprin?tf(stder?r,"Error?:socke?tcreat?e");exit(-6);}bzero?(&sin,sizeo?f(sin));sin.sin_p?ort=sp->s_por?t;if(bind(s,(struc?tsocka?ddr*)&sin,sizeo?f(sin))==-1){fprin?tf(stder?r,"Error?:bind");close?(s);exit(-6);}if(liste?n(s,5)==-1){fprin?tf(stder?r,"Error?:liste?n");close?(s);exit(-6);}while?(1){fprin?tf(stder?r,"\n\t\t\tNowwaitconne?ct...\n");if((ns=accep?t(s,0,0))==-1){waitaconne?ction?*fprin?tf(stder?r,"error?:accep?t");conti?nue;}if((pid=fork())==-1){conne?ted,andthencreat?echild?procfprin?tf(stder?r,"serve?r:forkerror?!");close?(s);exit(-1); }if(pid!=0){paren?tproce?,nothi?ngtodo,andtothenextloopclose?(ns);wait(0);conti?nue; }if(pid==0){enter?edchild?procc?edure?close?(s);if((sp1=getse?rvbyn?ame(sserv?ice,"tcp"))==NULL){fprin?tf(stder?r,"Error?:getse?rvbyn?ames1");exit(-5); }if((_addr?,_fami?ly=_port?=sp1->s_por?t;if((ss=socke?t(AF_IN?ET,SOCK_?STREA?M,0))==-1){fprin?tf(stder?r,"Error?:socke?ts1");exit(-6); }if(conne?ct(ss,(struc?tsocka?ddr*)&sin1,sizeo?f(sin1))==-1){fprin?tf(stder?r,"Error?:conne?cts1");close?(ss);exit(-6); }print?f("Recei?veaclien?tconne?ct:%s\n",argv[1]);while?(1) {bzero?(buf,sizeo?f(buf));if((n=read(ns,buf,sizeo?f(buf))<=0)){fprin?tf(stder?r,"Readnothi?ngfromsocke?t:ns\n");close?(ns);exit(-3); }print?f("datafromclien?t:%s\n",buf);reque?stmessa?gegotfromtheClien?t.print?f("datatoserve?r:%s\n",buf);if(write?(ss,buf,strle?n(buf))!=strle?n(buf)){toserve?rfprin?tf(stder?r,"Write?Socke?tssERROR?!s1\n");close?(ss);exit(-1); }if(strcm?p(buf,"over")==0)break?;bzero?(buf,sizeo?f(buf));if((n=read(ss,buf,sizeo?f(buf)))==0){fromserve?rfprin?tf(stder?r,"ReadSocke?tssError?!s1\n");close?(ss);exit(-2); }print?f("datafromserve?r:%s\n",buf);EndtheCommu?nicat?ionwithmyServe?rNext2Line,build?arepla?yMessa?gebuf,andwrite?itbackprint?f("datatoclien?t:%s\n",buf);if(write?(ns,buf,strle?n(buf))!=strle?n(buf)){fprin?tf(stder?r,"Write?socke?tnserror?!\n");close?(ns);exit(-4); } }close?(ss);close?(ns);exit(0);}}}7.4客戶端程?序#inclu?de<stdio?..(intargc,char**argv){struc?tsin;通用地址結(jié)?構(gòu)sock?addrstruc?tserve?nt*sp;服務(wù)器數(shù)據(jù)?結(jié)構(gòu)ser?ventcharbuf[50];ints,pid;char*servi?ce,*dest;1檢查命令行?參數(shù)個數(shù)if(argc!=1){ servi?ce=argv[1]; dest=argv[2]; }else{fprin?tf(stder?r,"NOservi?ceassig?ned!\nUsag?e:");fprin?tf(stder?r,"%sservi?ce_na?medesti?natio?n!\n",argv[0]);fprin?tf(stder?r,"Note:servi?ce_na?meisdefin?edinetcse?rvice?s\n");fprin?tf(stder?r,"desti?natio?nisdefin?edinetc");exit(-1);}2獲得服務(wù)信?息if((sp=getse?rvbyn?ame(servi?ce,"tcp"))==NULL){fprin?tf(stder?r,"Error?:getse?rvbyn?ame");exit(-5);}3獲得(服務(wù)器)主機信息if((,sizeo?f(sin));首先清0b
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版暖氣片購銷合同正規(guī)范本
- 2025年度金融產(chǎn)品創(chuàng)新設(shè)計與推廣服務(wù)合同2篇
- 2025年度綠色環(huán)保項目合伙人投資合作協(xié)議2篇
- 2025年度科技創(chuàng)新產(chǎn)品采購項目委托代理服務(wù)合同3篇
- 2025年度科技園區(qū)不動產(chǎn)使用權(quán)出讓合同3篇
- 2025年訴訟保全擔(dān)保流程執(zhí)行與賠償責(zé)任合同3篇
- 二零二五年度酒店行業(yè)員工派遣合同3篇
- 養(yǎng)殖場2025年度保險服務(wù)合同3篇
- 二零二五版財產(chǎn)保全擔(dān)保與訴訟保全合同3篇
- 2025年度龍門吊租賃及項目管理咨詢服務(wù)合同4篇
- 餐飲行業(yè)智慧餐廳管理系統(tǒng)方案
- 2025年度生物醫(yī)藥技術(shù)研發(fā)與許可協(xié)議3篇
- 電廠檢修安全培訓(xùn)課件
- 殯葬改革課件
- 2024企業(yè)答謝晚宴會務(wù)合同3篇
- 雙方個人協(xié)議書模板
- 車站安全管理研究報告
- 瑪米亞RB67中文說明書
- 植物和五行關(guān)系解說
- 滬教牛津版初中英語七年級下冊全套單元測試題
- 因式分解法提公因式法公式法
評論
0/150
提交評論