




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
附件1:封面《Linux系統(tǒng)應(yīng)用與編程》課程設(shè)計(jì)說明書設(shè)計(jì)題目:模擬繳費(fèi)系統(tǒng)專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)指導(dǎo)教師:班級:學(xué)號:姓名:同組人:計(jì)算機(jī)科學(xué)與工程學(xué)院2021
前言伴隨著社會的發(fā)展,網(wǎng)絡(luò)信息交流已經(jīng)漸漸取代面對面的交談。其中是一種不可缺少的通信工具,他已經(jīng)滲入到人們的社會生活的各個方面。由于經(jīng)常要使用,所以還要涉及到服務(wù)收費(fèi),交費(fèi)系統(tǒng)的開發(fā)就很有必要了。當(dāng)代是一個追求效率的時(shí)代,隨著們生活水平的提高,消費(fèi)項(xiàng)目,服務(wù)種類的增加,社會需要方便和快捷的繳費(fèi)方式。在當(dāng)今網(wǎng)絡(luò)社會,技術(shù)成熟,發(fā)揮網(wǎng)絡(luò)技術(shù)優(yōu)勢,利用網(wǎng)絡(luò)實(shí)現(xiàn)快捷繳費(fèi)已經(jīng)成為可能。利用電子商務(wù)網(wǎng)絡(luò)以及眾多的營業(yè)網(wǎng)點(diǎn)實(shí)時(shí)收費(fèi),在幾乎不增加系統(tǒng)負(fù)擔(dān)的情況既可緩解目前收費(fèi)單位營業(yè)廳的緊張狀況,又方便用戶繳費(fèi),提高了費(fèi)用回收率。繳費(fèi)系統(tǒng)是基于UNIXSocket和mysql數(shù)據(jù)庫設(shè)計(jì)一個交易型中間件系統(tǒng)。在Linux環(huán)境下使用GNUC++,在Linuxmake開發(fā)工具的管理和控制下,利用Linux系統(tǒng)提供的Socket庫和mysql數(shù)據(jù)庫在網(wǎng)絡(luò)底層開發(fā)交易型中間件,同時(shí)簡要介紹了客戶端和服務(wù)器的工作模式。此模擬交費(fèi)系統(tǒng)采用“客戶端—中間件—服務(wù)器”模式,其中主要包括三大部分:客戶端,中間件和服務(wù)器端。客戶端主要實(shí)現(xiàn)用戶管理、查詢、交易(交費(fèi),購物等),撤銷和統(tǒng)計(jì)等功能;中間件要完成與客戶要求相符的功能——是本地的本地處理,否則發(fā)往服務(wù)器端——接受客戶端數(shù)據(jù),組織服務(wù)器端所需數(shù)據(jù),重組服務(wù)端返回?cái)?shù)據(jù),并返回給客戶方;服務(wù)器端主要實(shí)現(xiàn)客戶端或中間件提出的業(yè)務(wù)請求并做好留跡工作。本設(shè)計(jì)主要是利用UNIX系統(tǒng)提供的Socket庫在網(wǎng)絡(luò)底層,C++語言,mysql數(shù)據(jù)庫,以及軟件工程的思想方法和TCP/IP設(shè)計(jì)出的一個模擬交費(fèi)中間件系統(tǒng)。本設(shè)計(jì)包括了模擬交費(fèi)系統(tǒng)的開發(fā)環(huán)境,設(shè)計(jì)目的,總體設(shè)計(jì),詳細(xì)設(shè)計(jì),具體實(shí)現(xiàn)代碼,以及設(shè)計(jì)中遇到的問題及解決方法。將服務(wù)器端,中間件和客戶端進(jìn)行連接后可模擬出現(xiàn)實(shí)中交費(fèi)的的功能。它可以實(shí)現(xiàn)費(fèi)用查詢,話費(fèi)充值,打印花費(fèi)清單詳目等基本功能。
目錄前言 21、系統(tǒng)環(huán)境(硬件環(huán)境、軟件環(huán)境) 42、設(shè)計(jì)目的和要求 42.1、設(shè)計(jì)目的 42.2、設(shè)計(jì)要求 53、總體設(shè)計(jì) 63.1系統(tǒng)模型 63.2系統(tǒng)流程圖 74、詳細(xì)設(shè)計(jì) 84.1設(shè)計(jì)方法 84.2功能模塊說明 84.3開發(fā)接口說明 85、調(diào)試與測試 115.1調(diào)試 115.2運(yùn)行結(jié)果 126、遇到的問題及解決方法 14主要問題: 147、源程序清單 157.1客戶端 157.2中間件 247.3服務(wù)器 278、心得體會 349、參考文獻(xiàn) 37
1、系統(tǒng)環(huán)境(硬件環(huán)境、軟件環(huán)境)硬件環(huán)境:intelp43.06GHz80G硬盤軟件環(huán)境:基于windowsxp虛擬機(jī)下的RedLinux或者Fedora操作系統(tǒng)2、設(shè)計(jì)目的和要求2.1、設(shè)計(jì)目的基于UNIXSocket和MySQL數(shù)據(jù)庫,設(shè)計(jì)一個交易型中間件系統(tǒng)。這里的中間件是指交易型中間件。交易型中間件是指用在不同行業(yè)、不同部門間的通訊轉(zhuǎn)發(fā)和協(xié)議轉(zhuǎn)換的軟件,在不同的行業(yè)、不同的系統(tǒng)間提供通訊轉(zhuǎn)發(fā)和協(xié)議轉(zhuǎn)換的橋梁作用。例如電子商務(wù)、銀行代理業(yè)務(wù)軟件等都是這種類型的軟件。本設(shè)計(jì)不是基于WEB的,不需要很多與WEB開發(fā)相關(guān)的知識,主要是利用linux系統(tǒng)提供的Socket庫在網(wǎng)絡(luò)底層,開發(fā)交易型中間件。模擬繳費(fèi)系統(tǒng),通過對移動通信話費(fèi)查詢與繳費(fèi)業(yè)務(wù)進(jìn)行了系統(tǒng)全面的分析研究。針對現(xiàn)有系統(tǒng)中實(shí)時(shí)性不足而造成用戶欠費(fèi)太多使公司企業(yè)蒙受損失的問題。采用開發(fā)工具Linux進(jìn)行系統(tǒng)設(shè)計(jì)。基于linuxSocket和mysql數(shù)據(jù)庫,設(shè)計(jì)一個交易型中間件系統(tǒng)。提供通訊轉(zhuǎn)發(fā)和協(xié)議轉(zhuǎn)換的橋梁作用。例如電子商務(wù)、銀行代理業(yè)務(wù)軟件等都是這種類型軟件。這里的中間件是指交易型中間件。交易型中間件是指用在不同行業(yè)、不同部門間的通訊轉(zhuǎn)發(fā)和協(xié)議轉(zhuǎn)換的軟件,在不同的行業(yè)、不同的系統(tǒng)間。這里主要是利用linux系統(tǒng)提供的Socket庫在網(wǎng)絡(luò)底層,開發(fā)交易型中間件。本次設(shè)計(jì)要求實(shí)現(xiàn)對移動話費(fèi)信息輸入、查詢、編輯以及話費(fèi)統(tǒng)計(jì)各明細(xì)項(xiàng)目的數(shù)據(jù)編輯;可自主設(shè)定條件從而達(dá)到對話費(fèi)數(shù)據(jù)的多角度查詢功能;方便導(dǎo)入、導(dǎo)出數(shù)據(jù)及輸出報(bào)表。
2.2、設(shè)計(jì)要求(1)客戶端客戶端程序可命名為client,要求帶有兩個命令行參數(shù)一個是服務(wù)(自己定義,并保存在/etc/services中,比如mysvr15678),另一個是目的主機(jī)(自己定義,并保存在/etc/hosts內(nèi),也可使用DNS來解析),缺省時(shí)為本機(jī)。客戶端至少要實(shí)現(xiàn)如下功能:用戶管理;查詢;交易(交費(fèi),購物等);撤銷;留跡;本地業(yè)務(wù)統(tǒng)計(jì)。客戶端的環(huán)境可以是Windows系統(tǒng),也可以的Linux系統(tǒng)。(2)中間件中間件程序命名為middleware,要帶有三個參數(shù),一個是用于服務(wù)器的服務(wù)(名字,與客戶端同),第二個作為請求的服務(wù)(自己定義,并保存在/etc/services中,要區(qū)別于客戶端,比如mysvr25679),第三個為目的主機(jī)(定義在/etc/hosts內(nèi)),缺省時(shí)為本機(jī)。中間件要完成與客戶要求相符的功能:是本地的本地處理,否則發(fā)往服務(wù)器方。具體地是:接收客戶方數(shù)據(jù);組織服務(wù)器方所需數(shù)據(jù);重組服務(wù)方返回?cái)?shù)據(jù),并返回給客戶方;留跡;本地業(yè)務(wù)統(tǒng)計(jì)。中間件的環(huán)境可以是Windows系統(tǒng),也可以的Linux系統(tǒng)。(3)服務(wù)器服務(wù)器程序可命名為server,要求帶有一個服務(wù)參數(shù),與中間件的mysvr2同。服務(wù)器方程序要完成客戶端或中間件提出的業(yè)務(wù)請求,并做好留跡工作。服務(wù)端環(huán)境必須是Linux系統(tǒng)。(4)留跡或log留跡或log工作在客戶端、中間件和服務(wù)器三方都要做,以供統(tǒng)計(jì)或核對使用。客戶端或中間件方可以使用文本文件或數(shù)據(jù)庫,但在服務(wù)器方必須使用MySQL數(shù)據(jù)庫。3、總體設(shè)計(jì)3.1系統(tǒng)模型LogClient2LogClient2Client1 請求1請求2 返回返回 LogLog中間件(Middleware)請求服務(wù)響應(yīng)服務(wù)LogLogMiddleware服務(wù)器端(Server) 請求數(shù)據(jù)返回結(jié)果LogMiddlewareMysqldatabaseLogMiddlewareMysqldatabase這個程序是模擬交費(fèi)系統(tǒng),所以運(yùn)行時(shí)服務(wù)器一直處于工作狀態(tài),等待來自中間件發(fā)過來的服務(wù)或數(shù)據(jù)。而中間件只有在客戶端傳來數(shù)據(jù)或者要求服務(wù)時(shí)才處于運(yùn)行狀態(tài)。C/S應(yīng)用程序中復(fù)制尋找數(shù)據(jù)的步伐只需要訪問一個中間件系統(tǒng),由中間件完成網(wǎng)絡(luò)中獲得的數(shù)據(jù)源或服務(wù),進(jìn)行事先傳輸客戶請求,重組回復(fù)信息,最后將結(jié)果送回應(yīng)用程序的任務(wù)。3.2系統(tǒng)流程圖SSocker()建立服務(wù)方套接字,描述符為sbingd()綁定套接字與本地地址和端口Linsten()通知TCP,準(zhǔn)備接受Socker()建立服務(wù)方套接字,描述符為saccept()等待客戶方連接Connect()建立與服務(wù)方鏈接recv()/read()讀取客戶方數(shù)據(jù)Send()/write()向服務(wù)器方發(fā)送請求成功后返回與s具相同特性的新套接字服務(wù)處理及數(shù)據(jù)加等待服務(wù)器方send()/write向客戶方提供服務(wù)結(jié)果recv()/read讀取服務(wù)方數(shù)據(jù)Close()關(guān)閉新套接字s,結(jié)束本次對話Close()關(guān)閉最初套接字s,結(jié)束服務(wù)器Close()關(guān)閉最初套接字s,結(jié)束本次對話4、詳細(xì)設(shè)計(jì)4.1設(shè)計(jì)方法在Linux環(huán)境下,使用GNUC++,在UNIX/Linuxmake開發(fā)工具的的管理和控制下,利用UNIX/LinuxSocket庫在網(wǎng)絡(luò)的底層進(jìn)行開發(fā)設(shè)計(jì)。4.2功能模塊說明本系統(tǒng)主要由服務(wù)器,中間件,和客戶端構(gòu)成。(1)客戶機(jī):只負(fù)責(zé)發(fā)送和接收請求信息,此模塊的目的就是將信息呈現(xiàn)給用戶看,并提供相應(yīng)的操作選擇。此模塊處理信息的過程較簡單,原理如基本功能的現(xiàn)金支付所述,在此不再多做介紹。(2)中間件:與客戶機(jī)和服務(wù)器相連接,通過判斷倒數(shù)第二個字符來判斷選擇哪個服務(wù)器,具體的是把客戶端發(fā)來的信息轉(zhuǎn)發(fā)給哪個服務(wù)器。通過服務(wù)器反饋回來信息的特殊字符來判斷此信息是由哪個服務(wù)器發(fā)送而來。簡單來說,中間件在整個分布式系統(tǒng)中起數(shù)據(jù)總線的作用,將各種異構(gòu)系統(tǒng)通過中間件有機(jī)地結(jié)合成一個整體。(3)服務(wù)器:服務(wù)器在這一部分,需要實(shí)現(xiàn)的功能是直接繳費(fèi)。它的過程是接收從中間件過來的信息,在服務(wù)器的客戶賬戶上相應(yīng)加上對應(yīng)的話費(fèi),即更新服務(wù)器數(shù)據(jù)庫。更新成功直接之后,將繳費(fèi)成功的信息傳回中間件。4.3開發(fā)接口說明Mysql提供有多種開發(fā)接口:PHP,ODBC,PERL,C/C++,JAVAC常用的開發(fā)接口有:mysql_init,mysql_real_connect,mysql_query,mysql_store_result,mysql_fetch_row,mysql_free_result,mysql_close,mysql_init(1)mysql_init作用:是初始化MYSQL變量,為mysql_real_connect()做準(zhǔn)備。用法:MYSQL*mysql_init(MYSQL*mysql)返回值:MYSQL句柄或描述符;內(nèi)存不足是為NULL;(2)mysql_real_connect功能:鏈接mysql數(shù)據(jù)庫;用法:MYSQL*mysql_real_connect(MYSQL*mysql,\ constchar*host,constchar*user, \ constchar*passwd,constchar*db, \ unsignedintport,constchar*unix_socket, \ unsignedintclient_flag)說明:如果port!=0,則將作為TCP/IP端口使用,默認(rèn)為0;如果unix_socket!=NULL,則可指定socket或命名PIPE,默認(rèn)為NULL;Client_flag可以指定特定的值(略),默認(rèn)為0.(3)mysql_query功能:查詢實(shí)施用法:intmysql_query(MYSQL*mysql,constchar*query)說明:query為數(shù)據(jù)庫操作命令字符串,本義是查詢(select),可包括select,update,insert,delete等對數(shù)據(jù)庫操作的命令。mysql_query不能用來處理二進(jìn)制數(shù)據(jù),處理二進(jìn)制數(shù)據(jù)可使用mysql_real_query。返回值:0表示正常,非0表示發(fā)生了錯誤。(4)mysql_store_resul功能:結(jié)果集處理。如果使用mysql_query運(yùn)行的是一個SELECT語句,或其它可以返回結(jié)果的查詢,可用函數(shù)mysql_store_result來訪問返回結(jié)果并并將其保存在一個變量中,以便做進(jìn)一步處理。用法:MYSQL_RES*mysql_store_result(MYSQL*mysql)MYSQL_RES*mysql_use_result(MYSQL*mysql)說明:mysql為mysql_real_connect函數(shù)的返回值。(5)結(jié)果集的使用使用了mysql_store_result函數(shù)保存結(jié)果后,可以使用以下函數(shù)對結(jié)果集進(jìn)行處理。=1\*GB3①獲得結(jié)果集中的行數(shù):my_ulonglongmysql_num_rows(MYSQL_RES*result)=2\*GB3②獲得結(jié)果集行的域字段數(shù):unsignedintmysql_num_fields(MYSQL_RES*result)unsignedintmysql_num_fields(MYSQL*mysql)=3\*GB3③讀取結(jié)果集中的一行:MYSQL_ROWmysql_fetch_row(MYSQL_RES*result)=4\*GB3④獲取結(jié)果集中行的域段數(shù):unsignedintmysql_field_count(MYSQL*mysql)=5\*GB3⑤獲得結(jié)果集中的域的屬性:MYSQL_FIELD*mysql_fetch_field(MYSQL_RES*result)=6\*GB3⑥獲得域?qū)傩詳?shù)組:MYSQL_FIELD*mysql_fetch_fields(MYSQL_RES*result)=7\*GB3⑦查詢被update、delete、insert等受影響的行:my_ulonglongmysql_affected_rows(MYSQL*mysql)(6)善后工作當(dāng)對數(shù)據(jù)庫使用完畢后,應(yīng)對所創(chuàng)建的變量等進(jìn)行釋放:mysql_free_result(result);mysql_close(&mysql);(7)錯誤處理方法有2:利用函數(shù)的返回值來判斷函數(shù)執(zhí)行是否正確;2.使用mysql提供的錯誤號和錯誤信息:錯誤號:unsignedintmysql_errno(MYSQL*mysql)錯誤信息:char*mysql_error(MYSQL*mysql)(8)輔助函數(shù)獲取客戶機(jī)版本信息:char*mysql_get_client_info(void)獲取主機(jī)信息:char*mysql_get_host_info(MYSQL*mysql)獲取協(xié)議版本信息:unsignedintmysql_get_proto_info(MYSQL*mysql)獲取服務(wù)器版本信息:char*mysql_get_server_info(MYSQL*mysql)獲取可用數(shù)據(jù)庫列表:MYSQL_RES*mysql_list_dbs(MYSQL*mysql,constchar*wild)獲取數(shù)據(jù)庫的可有表列表:MYSQL_RES*mysql_list_tables(MYSQL*mysql,constchar*wild)
5、調(diào)試與測試5.1調(diào)試(1)把數(shù)據(jù)庫文件導(dǎo)入數(shù)據(jù)庫#mysql–uroot<c1.sh#mysql–uroot<middl.sh#mysql–uroot<s1.sh創(chuàng)建服務(wù)端口Myclt56787/tcpMymid56788/tcp(3)對程序進(jìn)行編譯連接#gcc–occmainmenu26.c#gcc–ommmid.c#gcc–ossserver.c–L/usr/lib/mysql-lmysqlclient(4)運(yùn)行程序#./mm切換到終端2#./ss切換到終端4#./cc5.2運(yùn)行結(jié)果6、遇到的問題及解決方法主要問題:1、首先遇到的問題是總是提示”段錯誤”,開始時(shí)摸不著頭腦,就和同學(xué)一塊商量查資料,知道所謂的段錯誤就是指訪問的內(nèi)存超出了系統(tǒng)所給這個程序的內(nèi)存空間,
簡而言之,產(chǎn)生段錯誤就是訪問了錯誤的內(nèi)存段,一般是你沒有權(quán)限,或者根本就不存在對應(yīng)的物理內(nèi)存,尤其常見的是訪問0地址。后來經(jīng)過我們的討論,查找錯誤位置,慢慢修改過來了。2、由于對數(shù)據(jù)庫的了解不夠深,所以在服務(wù)器中調(diào)用數(shù)據(jù)庫出現(xiàn)問題。在實(shí)現(xiàn)客戶端通過中間件與服務(wù)器通信時(shí),總是提示套接字錯誤。進(jìn)過調(diào)試發(fā)現(xiàn)這個問題是在服務(wù)器接收到數(shù)據(jù)后,在查詢數(shù)據(jù)庫時(shí)沒有將參數(shù)傳給buf,所以服務(wù)器沒有給客戶端回復(fù)信息。3、可能是不夠細(xì)心,所以編程過程中,總是會出現(xiàn)指針類型與字符數(shù)組類型不匹配的問題,這是小問題,看著錯誤提示,稍微修改一下就好了。4、在使用字符分割函數(shù)char*strtok(char*str,constchar*delim);時(shí),后面那個參數(shù)我們使用了空格,所以經(jīng)常出現(xiàn)警告或者錯誤。后來我們把后面一個參數(shù)改為“|”,問題就解決了。5、還有一個很嚴(yán)重的錯誤,就是服務(wù)器程序中的while循環(huán)用錯了位置,定義的sendmg()函數(shù)與recmg();函數(shù)沒有放一起,所以不能實(shí)現(xiàn)服務(wù)器收到信息后立即回應(yīng),以至于運(yùn)行時(shí)出現(xiàn)死循環(huán)。解決方法就是:我們把sendmg()函數(shù)放在recmg();函數(shù)后面,問題就迎刃而解了。
7、源程序清單7.1客戶端#include<stdio.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<netdb.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#define rec_length 200struct hostent*hp;struct sockaddr_insin;struct servent*sp;char buf[500];int s;char cellnum[30];void mainmenu();void login();void regcell();void usrmg();void query();void recharge();void suite();void usrinfo();voidcellinfo();void bussness();voidclientlog();main(){ if((sp=getservbyname("myclt","tcp"))==NULL){//getstructservent*spfrom/etc/services exit(-2); } if((hp=gethostbyname("localhost"))==0){//getstructhostent*hpfrom/etc/hostsorDNS exit(-3); } //tobuildstructsockaddr_insinfromsp&hp bzero(&sin,sizeof(sin)); bcopy(hp->h_addr,&sin.sin_addr,hp->h_length); sin.sin_family=hp->h_addrtype; sin.sin_port=sp->s_port; if((s=socket(AF_INET,SOCK_STREAM,0))==-1){//createSOCKETs exit(-4); } if(connect(s,&sin,sizeof(sin))==-1){//connecttoserverwithstructsockaddr_insin close(s);exit(-5); } mainmenu();}voidmainmenu(){ system("clear"); charchoice[200]; printf(" \n"); printf(" ||\n"); printf(" | 1:login |\n"); printf(" | |\n"); printf(" | 2:register |\n"); printf(" | |\n"); printf(" | 3:logout|\n"); printf(" | |\n"); printf(" | |\n"); printf(" \n"); while(1) { inti=0; printf("Pleasechooseafuction:"); gets(choice); if(strlen(choice)!=1) { printf("Invalidinput,pleasetryagain:\n"); } else { if(choice[0]=='1') { login(); } if(choice[0]=='2') { regcell(); } if(choice[0]=='3') { return; } } }}voidlogin(){ charpassword[30]; charresult[100]; printf("Pleaseinputyourcellnumber(thelengthis11):\n"); gets(cellnum); while(strlen(cellnum)!=11) { printf("yournumberistoolongortooshort,pleaseinputanotherone:\n"); gets(cellnum); } printf("Pleaseinputyourpassword(thelengthis6):\n"); gets(password); while(strlen(password)!=6) { printf("yourpasswordistoolongortooshort,pleaseinputitagaintoverify:\n"); gets(password); } sprintf(buf,"1%s%s",cellnum,password); if(write(s,buf,rec_length)!=rec_length) { close(s);exit(-6); } if(read(s,result,rec_length)==0) { close(s);exit(-3); } if(result[0]=='Y'){ system("clear"); printf("LoginSucessfully!\n"); clientlog(cellnum,"LoginSucessfully"); usrmg(); } else { printf("Thisnumberdoesn'texsistoryourpasswordiswrong!\n"); clientlog(cellnum,"LoginFiled"); login(); }}voidregcell(){ chartelephone[20]; charpassword[30]; charid[20]; charresult[100]; printf("Youarenowregistering:\n"); printf("Inputyourcellphonenumber:\n"); gets(telephone); while(strlen(telephone)!=11) { printf("yournumberistoolongortooshort,pleaseinputagain:\n"); gets(telephone); } printf("pleaseinputyourpassword:\n"); gets(password);while(strlen(password)!=6) { printf("yourpasswordistoolongortooshort,pleaseinputitagaintoverify:\n"); gets(password); } printf("pleaseenteryouridnumber:\n"); gets(id); while(strlen(id)!=18) { printf("youridistooshortortoolong,pleaseinputagain:\n"); gets(id); } sprintf(buf,"2%s%s%s",telephone,password,id); if(write(s,buf,rec_length)!=rec_length){ close(s);exit(-6); } if(read(s,result,rec_length)==0){ close(s);exit(-3); } if(result[0]=='Y') { system("clear"); printf("Congratulateregistersuccessfully!\n"); clientlog(cellnum,"RegisterSucessfully"); usrmg(); } else { system("clear"); printf("Thisnumberhasalreadyexisted\n"); clientlog(cellnum,"RegisterFailed"); regcell(); }}voidusrmg(){ charchoice[200]; printf(" \n"); printf(" ||\n"); printf(" |1:query|\n"); printf(" |2:rechargebybank|\n"); printf(" |3:dobussnss|\n"); printf(" |4:reback|\n"); printf(" |5:exit|\n"); printf(" ||\n"); printf(" \n"); while(1) { printf("Pleaseenterachoice:\n"); gets(choice); if(strlen(choice)!=1) { printf("Invalidchoice,pleasetryagain:\n"); gets(choice); } else { if(choice[0]=='1') { system("clear"); query(); } if(choice[0]=='2') { system("clear"); bankpay(); } if(choice[0]=='3') { system("clear"); bussness(); } if(choice[0]=='4') { system("clear"); mainmenu(); } if(choice[0]=='5') { exit(0); } } }}voidquery(){ charchoice[200]; printf(" \n"); printf(" ||\n"); printf(" |1:checkusrinfo|\n"); printf(" |2:checksuite|\n"); printf(" |3:checkcellinfo|\n"); printf(" |4:reback|\n"); printf(" |5:exit|\n"); printf(" ||\n"); printf(" \n"); while(1) { printf("Pleaseenterachoice:\n"); memset(choice,0,sizeof(choice)); gets(choice); if(strlen(choice)!=1) { printf("Invalidchoice!\n"); } else { if(choice[0]=='1') { usrinfo(); } if(choice[0]=='2') { suite(); } if(choice[0]=='3') { cellinfo(); } if(choice[0]=='4') { usrmg(); } if(choice[0]=='5') { exit(0); } } }}voidbankpay(){ charbankcardid[20]; charpassword[30]; charresult[100]; printf("Pleaseinputyourbankcardid:\n"); gets(bankcardid); while(strlen(bankcardid)!=8) { printf("yourbankcardidistoolongortooshort,pleaseinputagain:\n"); gets(bankcardid); } printf("Pleaseinputyourbankcardpassword:\n"); gets(password); while(strlen(password)!=6) { printf("yourbankcardpasswordistoolongortooshort,pleaseinputagain:\n"); gets(password); } sprintf(buf,"3%s%s",bankcardid,password); if(write(s,buf,rec_length)!=rec_length){ close(s);exit(-6); } if(read(s,result,rec_length)==0){ close(s);exit(-3); } if(result[0]=='Y') { intmon; system("clear"); sscanf(result+1,"%d",&mon); printf("Paybybankcard%dSucessfully!\n",mon); clientlog(cellnum,"PaybybankcardSucessfully"); usrmg(); } else { system("clear"); printf("Thisnumberdoesn'texsistoryourpasswordiswrong.\n"); clientlog(cellnum,"Paybybankcardfailed"); usrmg(); }}voidsuite(){ inti; charresult[300]; memset(result,0,sizeof(result)); sprintf(buf,"4"); if(write(s,buf,rec_length)!=rec_length){ close(s);exit(-6); } if(read(s,result,rec_length)==0){ close(s);exit(-3); } for(i=0;i<strlen(result);i++) { if(result[i]=='') result[i]='\n'; } printf("%s",result);clientlog(cellnum,"querysuite"); query();}voidusrinfo(){ charresult[100]; sprintf(buf,"6"); memset(result,0,sizeof(result)); if(write(s,buf,rec_length)!=rec_length){ close(s);exit(-6); } if(read(s,result,rec_length)==0){ close(s);exit(-3); } printf("cell_num|id_number|name\n"); printf("%s",result);clientlog(cellnum,"queryusrinfo"); query();}voidbussness(){ charsuitenum[5]; charresult[100]; printf("Pleaseinputanumberrepresentforsuitetype:\n"); gets(suitenum); while(strlen(suitenum)!=3) { printf("Nosuchsuitetype,pleasechooseagain:\n"); gets(suitenum); } sprintf(buf,"7%s",suitenum); if(write(s,buf,rec_length)!=rec_length){ close(s);exit(-6); } if(read(s,result,rec_length)==0){ close(s);exit(-3); } if(result[0]=='Y'){ system("clear"); printf("ChoosesuiteSucessfully!\n"); clientlog(cellnum,"buyanewsuite"); usrmg(); } else{ system("clear"); printf("Suitechoosendonesn'texist!\n"); clientlog(cellnum,"buyanewsuitefailed"); usrmg(); }}voidcellinfo(){ charbb[100]; charb1[100]; charch[10]="5custom"; sprintf(buf,"%s",ch); if(write(s,buf,rec_length)!=rec_length){ close(s);exit(-6); } if(read(s,bb,rec_length)==0){ close(s);exit(-3); } printf("%s",bb); clientlog(cellnum,"querycellinfo"); query();}voidclientlog(char*cell,char*activity){charfinalstring[100]="/root/log1";strcat(finalstring,cell);strcat(finalstring,"");strcat(finalstring,activity);system(finalstring);}7.2中間件#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<netdb.h>#include<string.h>#include<stdlib.h>#include<sys/stat.h>#include<time.h>#include<fcntl.h>#include<unistd.h>#definerec_length 200main(){ // structuredefinedforrequestasaclient struct hostent*hp1; struct sockaddr_insin1; struct servent*sp1; char sbuf[500]; int ss,pid; char *sservice,*sdest; // structuredefinedforrequestasaserver structsockaddr_insin; structservent*sp; ints,ns,fd; char buf[500]; char *service; char cid[20]; char cpd[30]; char rid[20]; char rpd[30]; char peid[20]; char cho; int l=0,k=1; char str[200]; char bb[300]; char bd[300]; char su[5]; charcc[200]; time_tt; if((sp=getservbyname("myclt","tcp"))==NULL){ fprintf(stderr,"Error:getservbyname"); exit(-2); } if((s=socket(AF_INET,SOCK_STREAM,0))==-1){ fprintf(stderr,"Error:socketcreate"); exit(-3); } bzero(&sin,sizeof(sin)); sin.sin_port=sp->s_port; if(bind(s,&sin,sizeof(sin))==-1){ fprintf(stderr,"Error:bind"); close(s);exit(-4); } if(listen(s,5)==-1){ fprintf(stderr,"Error:listen"); close(s);exit(-5); } while(1){ fd=open("mid.log",O_CREAT|O_APPEND|O_WRONLY,0); t=time(NULL); strcpy(cc,"waitaconnection"); strcat(cc,ctime(&t)); write(fd,cc,strlen(cc)); fprintf(stderr,"\n\t\t\tNowwaitconnect...\n"); if((ns=accept(s,0,0))==-1){//waitaconnection*/ fprintf(stderr,"error:accept");continue; } t=time(NULL); strcpy(cc,"conneted,andthencreatechildproc"); strcat(cc,ctime(&t)); write(fd,cc,strlen(cc)); if((pid=fork())==-1){//conneted,andthencreatechildproc fprintf(stderr,"server:forkerror!"); close(s);exit(-6); } if(pid!=0){//parentproce,nothingtodo,andtothenextloop close(ns);wait(0);continue; } if(pid==0){//enteredchildproccedure close(s); //sisnotusedinChild,clodeit //requestmessagegotfromtheClient. //BegineaConnectiontoServerasaClient if((sp1=getservbyname("mymid","tcp"))==NULL){ fprintf(stderr,"Error:getservbynamess"); exit(-8); } if((hp1=gethostbyname("localhost"))==0){ fprintf(stderr,"Error:gethostbynamess"); exit(-9); } bzero(&sin1,sizeof(sin1)); bcopy(hp1->h_addr,&sin1.sin_addr,hp1->h_length); sin1.sin_family=hp1->h_addrtype; sin1.sin_port=sp1->s_port; if((ss=socket(AF_INET,SOCK_STREAM,0))==-1){ fprintf(stderr,"Error:sockets1"); exit(-10); } if(connect(ss,&sin1,sizeof(sin1))==-1){ fprintf(stderr,"Error:connectss"); close(ss);exit(-11); } //next2Linebuildrequestmessage printf("Receiveaclientconnect:client\n"); while(1) { if(read(ns,buf,rec_length)==0){ fprintf(stderr,"Readnothingfromsocket:ns\n"); close(ns);exit(-7); } strcpy(sbuf,buf); if(write(ss,sbuf,rec_length)!=rec_length){//toserver close(ss);exit(-12); } printf("midwaregetmessagefromns:%s\n",buf); if(read(ss,sbuf,rec_length)==0){ close(ss);exit(-7); } strcpy(buf,sbuf); if(write(ns,buf,rec_length)!=rec_length){ close(ns);exit(-6); } } close(ss); } close(ns);exit(0); }}7.3服務(wù)器#include<stdio.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<netdb.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<mysql/mysql.h>#definerec_length 200main(){ structsockaddr_insin; structservent*sp; int s,ns,pid; char buf[500]; char cellnum[20]; char cellpswd[30]; char bankcardid[20]; char bankcardpswd[30]; char id[20]; char choice; int l=0,k=1; char combinestr[200]; char jieguo[300]; char bd[300]; char suite[5]; MYSQL mysql; MYSQL_RES *result; MYSQL_ROW row; if((sp=getservbyname("mymid","tcp"))==NULL){//getservent*spfrom/etc/services fprintf(stderr,"Error:getservbyname"); exit(-5); } if((s=socket(AF_INET,SOCK_STREAM,0))==-1){//createSOCKETs fprintf(stderr,"Error:socketcreate"); exit(-6); } //tobuildstructsockaddr_insinfromservent*sp bzero(&sin,sizeof(sin)); sin.sin_port=sp->s_port; if(bind(s,&sin,sizeof(sin))==-1) {//bindSOCKETswithstructsockaddr_insin fprintf(stderr,"Error:bind"); close(s);exit(-6); } if(listen(s,5)==-1) {//listen:Iamwillingtoacceptclientrequest fprintf(stderr,"Error:listen"); close(s);exit(-6); } while(1) {//alwayswaitingforconnection fprintf(stderr,"\n\t\t\tNowwaitconnect...\n"); if((ns=accept(s,0,0))==-1) {//waitaconnection fprintf(stderr,"error:accept");continue;//mayexithere }//anewcomerisaraived if((pid=fork())==-1) {//conneted,andthencreatechildproctoserveit fprintf(stderr,"server:forkerror!"); close(s);exit(-1); } if(pid!=0) {//parentproc,nothingtodo,andtothenextloop close(ns);wait(0);continue; }//nsifnotusedinparent,closeit if(pid==0) {//enteredchildproccedure close(s); //sisnotusedinChild,closeit while(k) { if(read(ns,buf,rec_length)==0) { close(ns);exit(-3); } printf("servergetmessagefromns:%s\n",buf); choice=buf[0]; printf("%c\n",buf[0]); if(choice=='1') { system("/root/log2"); sscanf(buf+1,"%s%s",cellnum,cellpswd); sprintf(combinestr,"select*fromverifywherecellnum='%s'andpassword='%s'",cellnum,cellpswd); printf("%s\t%s\n",cellnum,cellpswd); mysql_init(&mysql); mysql_real_connect(&mysql,"localhost","root",NULL,"clientdata",0,NULL,0); mysql_query(&mysql,combinestr); result=mysql_store_result(&mysql);row=mysql_fetch_row(result);printf("%s\t%s\n",row[0],row[1]); if(mysql_num_rows(result)==1) { printf("verifysucceed!\n"); if(write(ns,"Y",rec_length)!=rec_length) { close(ns);exit(-6); } } else { printf("verifyfailed!\n"); if(write(ns,"N",rec_length)!=rec_length) { close(ns);exit(-6); } } mysql_free_result(result); mysql_close(&mysql); } if(choice=='2') { system("/root/log2"); sscanf(buf+1,"%s%s%s",cellnum,cellpswd,id); printf("%s%s%s\n",cellnum,cellpswd,id); sprintf(combinestr,"select*fromBase_Infowherecellnum='%s'",cellnum); mysql_init(&mysql); mysql_real_connect(&mysql,"localhost","root",NULL,"clientdata",0,NULL,0); mysql_query(&mysql,combinestr); result=mysql_store_result(&mysql); printf("%d\n",mysql_num_rows(result)); if(mysql_num_rows(result)==1) { if(write(ns,"N",rec_length)!=rec_length) { close(ns);exit(-6); } } else { if(write(ns,"Y",rec_length)!=rec_length) { close(ns);exit(-6); } sprintf(combinestr,"insertverifyvalues('%s','%s')",cellnum,cellpswd); mysql_query(&mysql,combinestr); sprintf(combinestr,"insertBase_Infovalues('%s','%s',NULL,NULL,NULL)",cellnum,id); mysql_query(&mysql,combinestr); } mysql_free_result(result); mysql_close(&mysql); } if(choice=='3'){ system("/root/log2"); sscanf(buf+1,"%s%s",bankcardid,bankcardpswd); printf("%s %s",bankcardid,bankcardpswd); sprintf(combinestr,"select*frombankdatawherebknum='%s'andbkpswd='%s'",bankcardid,bankcardpswd); mysql_init(&mysql); mysql_real_connect(&mysql,"localhost","root",NULL,"clientdata",0,NULL,0); mysql_query(&mysql,combinestr); if(mysql_num_rows(result)==1) { intcellbalance; intbankbalance; inttemp; row=mysql_fetch_row(result); bankbalance=atoi(row[2]); sprintf(combinestr,"select*fromPro_staticwherecellnum='%s'",cellnum); mysql_query(&mysql,combinestr); result=mysql_store_result(&mysql); row=mysql_fetch_row(result); cellbalance=atoi(row[1]); temp=cellbalance; cellbalance+=bankbalance; bankbalance-=temp; sprintf(combinestr,"updatePro_staticsetbalance=%dwherecellnum='%s'",cellbalance,cellnum); mysql_query(&mysql,combinestr); sprintf(combinestr,"updatebankdatasetbalance=%dwherebknum='%s'",bankbalance,bankcardid); mysql_query(&mysql,combinestr); sprintf(jieguo,"Y%s",row[2]); if(write(ns,jieguo,rec_length)!=rec_length) { close(ns);exit(-6); } } else { if(write(ns,"N",rec_length)!=rec_length) { close(ns);exit(-6); } } mysql_free_result(result); mysql_close(&mysql); } if(choice=='4'){ inti=0; charc4[100]; chardd[300]=""; system("/root/log2"); sprintf(combinestr,"select*frombusiness"); mysql_init(&mysql); mysql_real_connect(&mysql,"localhost","root",NULL,"clientdata",0,NULL,0); mysql_query(&mysql,combinestr); result=mysql_store_result(&mysql); i=mysql_num_rows(result); while(i--) { row=mysql_fetch_row(result); sprintf(bd,"%s|%s|%s|%s",row[0],row[1],row[2],row[3]); strcat(dd,bd); } printf("%s\n",dd); if(write(ns,dd,rec_length)!=rec_length){ close(ns);exit(-6); } mysql_free_result(result); mysql_close(&mysql); } if(choice=='5') { system("/root/log2"); sprintf(combinestr,"select*fromPro_staticwherecellnum='%s'",cellnum); mysql_init(&mysql); mysql_real_connect(&mysql,"localhost","root",NULL,"clientdata",0,NULL,0); mysql_query(&mysql,combinestr); result=mysql_store_result(&mysql); row=mysql_fetch_row(result); sprintf(jieguo,"%s|%s|%s|%s\n",row[0],row[1],row[2],row[3]); if(write(ns,jieguo,rec_length)!=rec_length){ close(ns);exit(-6); } mysql_free_result(result); mysql_close(&mysql); } if(choice=='6') { system("/root/log2"); sprintf(combinestr,"select*fromBase_Infowherecellnum='%s'",cellnum); mysql_init(&mysql); mysql_real_connect(&mysql,"localhost","root",NULL,"clientdata",0,NULL,0); mysql_query(&mysql,combinestr); result=mysql_store_result(&mysql); row=mysql_fetch_row(result); sprintf(jieguo,"%s|\t%s|\t%s\n",row[0],row[1],row[2]); if(write(ns,jieguo,rec_length)!=rec_length){ close(ns);exit(-6); } mysql_free_result(result); mysql_close(&mysql); } if(choice=='7') { system("/root/log2"); sscanf(buf+1,"%s",suite); mysql_init(&mysql); mysql_real_connect(&mysql,"localhost","root",NULL,"clientdata",0,NULL,0); if(write(ns,"Y",rec_length)!=rec_length) { close(ns);exit(-6); } sprintf(combinestr,"updateBase_Infosetsuit_type='%s'w
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CSTE 0075-2021“領(lǐng)跑者”標(biāo)準(zhǔn)評價(jià)要求學(xué)校塑膠跑道
- T/CSPSTC 50-2020裝配式混凝土建筑預(yù)制構(gòu)件設(shè)計(jì)深度規(guī)程
- T/CSIQ 8015-2018實(shí)驗(yàn)室分級評定準(zhǔn)則
- T/CPMA 033-2023成人慢性病行為危險(xiǎn)因素監(jiān)測基本數(shù)據(jù)集標(biāo)準(zhǔn)
- T/CNIDA 014-2023核電建設(shè)項(xiàng)目監(jiān)理人員配置標(biāo)準(zhǔn)
- T/CMRA 06-2019鋁框塑料模板
- T/CMA HG029-2021輪胎雪地抓著性能測試道路制作及道路驗(yàn)收和維護(hù)
- T/CIQA 2-2019檢驗(yàn)鑒定從業(yè)人員行為規(guī)范
- T/CIES 016-2018電視演播室燈光系統(tǒng)運(yùn)行維護(hù)標(biāo)準(zhǔn)
- T/CI 243-2023高層裝配式鋼結(jié)構(gòu)建筑施工技術(shù)規(guī)程
- (2023版)養(yǎng)老機(jī)構(gòu)院內(nèi)感染預(yù)防與控制規(guī)范解讀課件
- 傳統(tǒng)文化中國茶文化英語介紹
- 腦膠質(zhì)瘤課件
- 鋁合金鑄件冒口尺寸與補(bǔ)縮距離的影響因素
- 統(tǒng)計(jì)局考試試題及答案
- 工廠防暑降溫安全知識培訓(xùn)內(nèi)容
- 統(tǒng)計(jì)與概率課標(biāo)解讀與案例分析
- 《馬褲先生》閱讀答案
- 人教版九年級數(shù)學(xué)上冊《垂直于弦的直徑》評課稿
- 漸開線花鍵計(jì)算(最全的花鍵計(jì)算公式)
- 數(shù)學(xué)中考模擬試卷雙向細(xì)目表模板
評論
0/150
提交評論