版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
笔者刖言移动通信业务中,【】有一部分都是和手机缴费的业务相关,而手机缴费业务目前处于发展的阶段,手机缴费业务作为目前唯一的数据业务正在飞速发展中近年来,随着中国市场经济的高速发展的情况下,社会上出现了很多新消费模式,由此移动通信行业衍生出很多新的业务,具体情况可以总结为以下几点:这追求效率的时代,随着们生活水平的提高,消费项目,服务种类的增加,社会需要方便和快捷的缴费方式。在当今网络社会,技术成熟,发挥网络技术优势,利用网络实现快捷缴费已经成为可能。利用电子商务网络以及众多的营业网点实时收费,在几乎不增加系统负担的情况既可缓解目前收费单位营业厅的紧张状况,又方便用户缴费,提高了费用回收率。手机缴费系统是基于UNIXSocket和MySQL数据库设计一个交易型中间件系统。在Linux环境下使用GNUC或者GNUC++,在Linuxmake开发工具的管理和控制下,利用Linux系统提供的Socket库和MySQL数据库在网络底层开发交易型中间件,同时简要介绍了客户端和服务器的工作模式。此模拟手机交费系统采用“客户端一中间件一服务器”模式,其中主要包括三大部分:客户端(Client),中间件(Middleware)和服务器端(Server)。客户端(Client)主要实现用户管理、查询、交易(交费,购物等),撤销和统计等功能;中间件(Middleware)要完成与客户要求相符的功能一一是本地的本地处理,否则发往服务器端——接受客户端数据,组织服务器端所需数据,重组服务端返回数据,并返回给客户方;服务器端(Server)主要实现客户端或中间件提出的业务请求并做好留迹工作。本设计主要是利用UNIX系统提供的Socket库在网络底层,C语言,MySQL数据库,以及软件工程的思想方法和TCP/IP设计出的一个模拟手机交费中间件系统。本设计包括了模拟手机交费系统的开发环境,设计目的,总体设计,详细设计,具体实现代码,以及设计中遇到的问题及解决方法。将服务器端(Server),中间件(Middleware)和客户端(Client)进行连接后可模拟出现实中手机交费的的功能。它可以实现手机费用查询,话费充值,打印花费清单详目等基本功能。目录TOC\o"1-5"\h\z一、系统环境(硬件环境、软件环境)3二、计目的3三、体设计(程序设计组成框图、流程图、类图)33.1程序设计组成框图:3\o"CurrentDocument"3.2:中间件模型43.3流程图5四、详细设计74.1设计方法7\o"CurrentDocument"4.2功能模块说明7五、调试与测试9\o"CurrentDocument"5.1调试方法9\o"CurrentDocument"5.2结果及简单分析10\o"CurrentDocument"六、设计中遇到的问题及解决方法11\o"CurrentDocument"七、源程序清单12\o"CurrentDocument"八、总结,收获与体会37九、参考文献37一、系统环境(硬件环境、软件环境)硬件环境:intelp43.06GHz80G硬盘软件环境:基于windowsxp虚拟机下的RedLinux操作系统二、计目的本次设计的主要课题是:模拟手机缴费系统,通过对移动通信话费查询与缴费业务进行了系统全面的分析研究。针对现有系统中实时性不足而造成用户欠费太多使公司企业蒙受损失的问题。采用开发工具Linux+My进行系统设计。基于UinxSocket和MySQL数据库,设计一个交易型中间件系统。提供通讯转发和协议转换的桥梁作用。例如电子商务、银行代理业务软件等都是这种类型软件。这里的中间件是指交易型中间件。交易型中间件是指用在不同行业、不同部门间的通讯转发和协议转换的软件,在不同的行业、不同的系统间。这里主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件。本设计的目的是使参与设计者掌握利用软件工程的思想方法和TCP/IP设计出用于不同行业和部门间的通讯转发或协议转换软件一中间件,尤其掌握这种设计的思想和方法。本设计系统能够通过两种方式提供对移动话费信息输入、查询、编辑以及话费统计各明细项目的数据编辑,自动计算出花费的各项合计数据;可自主设定条件从而达到对话费数据的多角度查询功能;方便导入、导出数据及输出报表。三、体设计(程序设计组成框图、流程图、类图)3・1程序设计组成框图:实现工具及、方法基本功能、Linux+Mysql+VMwareWorkstation客户1.手机余额查询客户端发送:头部(A)+目标(移动公司P)+手机号码(15)+机主姓名(30)中间件发送:头部(B)+目标(移动公司P)+标志(O)
端<——>中间件+手机号码(15)+机主(30)+余额(20)或:头部(B)目标(移动公司P)+标志(E)+出错原因2.银行账户余额查询:客户端发送:头部(A)+目标(银行B)+银行账户(19)+密码(10)中间件发送:头部(B)+目标(银行B)+标志(0)+户主(30)+账号(19)+余额(20)或:头部(B)+目标(银行B)+标志(E)+错误信息3.手机充值客户端发送:头部(C)+手机号码(15)+银行账户(19)+银行密码(10)+充值金额(20)中间件发送:头部(D)+标志(0)或:头部(D)+标志(E)+错误原因中间件<——>服务器中间件<---->银行服务器查询余额中间件发送:头部(E)+银行账户(19)+密码(10)服务器发送:头部(F)+标志(0)+银行账号(19)+用户名(30)+余额(20)或:头部(F)+标志(E)+出错原因扣款中间件发送:头部(G)+银行账户(19)+密码(10)+扣款金额(20)服务器发送:头部(H)+标志(O)或:头部(H)+标志(E)+出错原因中间件<——>移动服务器查询余额中间件发送:头部(E)+手机号码(15)服务器发送:头部(F)+标志(O)+手机号码(15)+机主姓名(30)+余额(20)或:头部(F)+标志(E)+出错原因缴费中间件发送:头部(G)+手机号码(15)+缴费金额(20)服务器发送:头部(H)+标志(O)或:头部(H)+标志(O)+出错原因退出系统当完成一次交易时,就可以退出系统。3.2:中间件模型3.3流程图
、详细设计4・1设计方法在Linux环境下,使用GNUC或GNUC++,在UNIX/Linuxmake开发工具的的管理和控制下,利用UNIX/LinuxSocket库在网络的底层进行开发设计。4.2功能模块说明本系统主要是由一个客户机,一个中间件以及两个服务器组成,两个服务器分别负责手机直接缴费和网上银行缴费。以下即是每个模块间的联系图:(1)客户机:只负责发送和接收请求信息,此模块的目的就是将信息呈现给用户看,并提供相应的操作选择。此模块处理信息的过程较简单,原理如基本功能的现金支付所述,在此不再多做介绍。(2)中间件:与客户机和服务器相连接,通过判断倒数第二个字符来判断选择哪个服务器,具体的是把客户端发来的信息转发给哪个服务器。通过服务器反馈回来信息的特殊字符来判断此信息是由哪个服务器发送而来。简单来说,中间件在整个分布式系统中起数据总线的作用,将各种异构系统通过中间件有机地结合成一个整体。(3)服务器:本系统有两个服务器,手机服务器(S2)和银行服务器(S1)1)手机服务器在这一部分,需要实现的功能是直接缴费。它的过程是接收从中间件过来的信息,在手机服务器的客户账户上相应加上对应的话费,即更新手机服务器数据库。更新成功直接之后,将缴费成功的信息传回中间件。具体流程如下:现金缴纳话费工作流程图服务器数据库,即缴费成功。2)银行服务器在银行服务器这一块,需要实现的功能是手机网上缴费。它的过程是接收从中间件过来的信息,在客户所输入的银行账户上扣除相应的手机费用;如果在手机的服务器那一块出现问题,缴费不成功,银行服务器还负责把之前所扣除的话费给加上,具体实现流程如下:
查询用户信息选择银行服务器后整个系统的工作流程图:五、调试与测试5.1调试方法把数据库文件导入数据库#mysql-uroot<c1.sh#mysql-uroot<middl.sh#mysql-uroot<s1.sh#mysql-uroot<s2.sh启动Mysql数据(以bank为例)#showdatabase;#usebank;#showtables;#select*frominformation;对程序进行编译连接#gcc-oc1c1.c-L/usr/lib/mysql-lmysqlclient#gcc-om1m1.c-L/usr/lib/mysql-lmysqlclient#gcc-os1s1.c-L/usr/lib/mysql-lmysqlclient#gcc-os2s2.c-L/usr/lib/mysql-lmysqlclient(5)运行程序#./m1x切换到终端2#./s1world切换到终端3#./s2zhongjr切换到终端4#./m1xmyhttp5・2结果及简单分析1:缴费======/迎您使用手机嬲费系统====="始手机缴费八查刑祖行喘户3..该询手机余额站退出系统请选样数字操作:3请输入手机杪F为查调信息:A手机号码:335237522B4查训成功!!屯诂号码:335237522B4手机户4iizhactao密户余祯:4C2.COCOOOOOCfl按回车键返回一•银行缴费,银行服务器与手机服务器都对信息有相应的操作,缴费得到确认成功后,银行卡上减去100元,手机话费加上100元2:查询========域迎您愤用于机巍我系吮======],始手机缴链4查训根行账户3,查血手机命敖私退由系统情迷样数字操作:公请输入银行账号OG140724S请输入银行密恂I2S以F为查训信息:A银行账户06140724S密码】约查询成功!!银行户.站zhaotao跟行账号¥OB1407248银行兼额:9997.0000000000按回车键返回整,六、设计中遇到的问题及解决方法我们遇到的第一个问题就是:传送的消息有许多乱码,后来分析得出是字符串数组没有清零,调用bzero(),清空后问题解决。在取系统日期时,我们的函数看着也没什么问题,但总提示有错误,最后发现原来忘记了头文件include<time.h>,加上后就正确了。还有一个最可恶的问题,老是莫名奇妙的出现”段错误”,开始时摸不着头脑,就和同学一块商量,凭着各自了了的一点经验讨论,还好最后都解决了,主要时字符串末尾一定要加‘\0’,表示结束,否则可能是越界。主要问题:(1)对Mysql数据库不够了解,对很多数据结构和算法也理解不够牢固,因此我们参考了《Linux+php+Mysql基础与提高》这本书,学到一些关于Mysql的基础知识,才使工作能顺利的进行下去。(2)对套接字这样的概念不是很清楚,在老师的辅导和互联网的帮助下,了解了一些这方面的知识,才使我们的设计开展下来。(3)以前对服务器,客户端只是了解理论知识,这次而要自己动手来开发服务器,这对我们来说,是一个巨大的挑战,服务器就是一个进程,确切的说是一个守候进程,要实现它的功能,是不容易的事情,你要学会套接字,地址转换,服务器相关的数据结构和算法才能进行开发和设计。(4)还是很多基础的东西没有掌握好,基本的算法也没有完全掌握,参考了教科书的相关内容后,才开始了我们的课程设计。
(5)在数据库的编写时,很多要用到的数据类型而我们又没有学过的,只能借助互联网的强大功能了,由此,我们也学到了很多相关的知识。七、源程序清单中间件代码:#include<sys/socket.h>#include<sys/un.h>#include<netinet/in.h>#include<errno.h>#include<unistd.h>#include<signal.h>#include<sys/wait.h>#include<netdb.h>#include<stdlib.h>#include<fcntl.h>#include<time.h>intmain(intargc,char*argv[]){中间件代码:#include<sys/socket.h>intlog(char*filepath,char*buff);charlog_file[10]="mid.log”;charlog_buf[1024];〃网络通信信息intlisten_fd;//监听套接字描述符intcom_fd;//通信套接字描述符intlen;//请求方地址长度intret;pid_tpid;//处理请求进程idstructservent*sp;//存放服务器端口信息,从services文件读取structsockaddr_insrv_addr;//服务器地址structsockaddr_inclt_addr;//客户端地址listen_fd=socket(PF_INET,SOCK_STREAM,0);/创建监听套接字〃数据库连接信息MYSQLmysql;//MySQL连接MYSQL_ROWrow;//结果的行MYSQL_RES*result;//查询结果charmyl_buf[1024];//存放sql语句〃初始化网络连接参数intDataSend(char*service,char*dest,charsed_buf[1024],charrcv_buf[1024]);if(listen_fd<0){perror(-创建监听套接字失败,');strcpy(log_buf,”创建监听套接字失败”);log(log_file,log_buf);return1;}//从services文件中获取服务器端口号if((sp=getservbyname(argv[1],"tcp"))==NULL){fprintf(stderr,"参数错误”);strcpy(log_buf,"参数错误");log(log_file,log_buf);exit(-5);}memset(&srv_addr,0,sizeof(srv_addr));//将srv_addr初始化为全0〃设定地址参数srv_addr.sin_family=AF_INET;srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);srv_addr.sin_port=sp->s_port;〃绑定服务套接字ret=bind(listen_fd,(structsockaddr*)&srv_addr,sizeof(srv_addr));if(ret==-1){perror("绑定服务套接字失败”);strcpy(log_buf,”绑定服务套接字失败");log(log_file,log_buf);close(listen_fd);return1;}〃监听客户连接ret=listen(listen_fd,1024);if(ret==-1){perror(-监听客户请求失败,');strcpy(log_buf,”监听客户请求失败”);log(log_file,log_buf);close(listen_fd);return1;}//连接users数据库if(mysql_init(&mysql)==NULL){fprintf(stderr,"数据连接初始失败”);strcpy(log_buf,”数据连接初始失败”);log(log_file,log_buf);exit(-1);}if(!mysql_real_connect(&mysql,"localhost”,"root”,0,"users”,0,NULL,0)){fprintf(stderr,"数据库连接错误:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_close(&mysql);exit(-2);}〃开始接受客户请求printf("等待客户连接\n");while(1){len=sizeof(clt_addr);com_fd=accept(listen_fd,(structsockaddr*)&clt_addr,&len);if(com_fd<0){perror("接受客户端连接请求失败,');strcpy(log_buf,"接受客户端连接请求失败,');log(log_file,log_buf);close(listen_fd);return1;}if((pid=fork())==-1){printf(-开创进程失败,,);strcpy(log_buf,"开创进程失败");log(log_file,log_buf);return1;}if(pid==0)〃创建子进程成功{close(listen_fd);//关闭监听套接字〃处理接受到的数据charsend_buf[1024];intlen;if(len=read(com_fd,send_buf,1024)>0){if(send_buf[0]=='C'){printf(-收到充值请求,信息如下\n");printf("%s\n",send_buf);printf("手机号码:%s\n",send_buf+2);printf("银行账号:%s\n”,send_buf+17);printf("银行密码:%s\n”,send_buf+36);printf("充值金额:%s\n”,send_buf+46);charp_send[1024];charp_rcv[1024];charb_send[1024];charb_rcv[1024];〃缴费封包memcpy(p_send,"G”,2);memcpy(p_send+2,send_buf+2,15);memcpy(p_send+17,send_buf+46,20);//扣款封包memcpy(b_send,"G”,2);memcpy(b_send+2,send_buf+17,19);memcpy(b_send+21,send_buf+36,10);memcpy(b_send+31,send_buf+46,20);DataSend(argv[2],argv[3],b_send,b_rcv);printf(-银行数据已发送\n");chart[1024];memcpy(t,"D",2);if(b_rcv[2]=='O'){DataSend(argv[4],argv[5],p_send,p_rcv);printf("移动公司数据已发送\n");if(p_rcv[2]=='O'){printf(”充值成功\n");memcpy(t+2,"O”,2);write(com_fd,t,1024);}elseif(p_rcv[2]=='E'){memcpy(t+2,"E”,2);memcpy(t+4,p_rcv+4,50);write(com_fd,t,1024);}elseif(b_rcv[2]=='E'){memcpy(t+2,"E”,2);memcpy(t+4,b_rcv+4,50);}}if(send_buf[0]=='A'){printf(叫攵到查询请求:\n");if(send_buf⑵=='B'){printf(叫攵到银行查询,信息如下\n");printf("%s\n",send_buf);printf("%s\n",send_buf+2);printf("银行账号:%s\n”,send_buf+4);printf("银行密码:%s\n”,send_buf+23);chartmp[1024];chartmp_r[1024];memcpy(tmp,"E”,2);memcpy(tmp+2,send_buf+4,19);memcpy(tmp+21,send_buf+23,10);printf("银行账号:%s\n”,tmp+2);printf("银行密码:%s\n",tmp+21);DataSend(argv[2],argv[3],tmp,tmp_r);printf("%s\n",tmp_r);printf("%s\n",tmp_r+2);printf("%s\n",tmp_r+4);printf("%s\n",tmp_r+6);printf("%s\n",tmp_r+36);printf("%s\n”,tmp_r+55);write(com_fd,tmp_r,1024);}elseif(send_buf[2]=='P'){printf("收到手机查询,信息如下\n");printf("%s\n",send_buf);printf("%s\n",send_buf+2);printf("手机号码:%s\n",send_buf+4);chartmp[1024];chartmp_r[1024];memcpy(tmp,"E”,2);memcpy(tmp+2,send_buf+4,15);printf("手机账号:%s\n",tmp+2);DataSend(argv[4],argv[5],tmp,tmp_r);printf("%s\n",tmp_r);printf("%s\n",tmp_r+2);printf("%s\n",tmp_r+4);printf("%s\n",tmp_r+6);printf("%s\n",tmp_r+21);printf("%s\n",tmp_r+57);write(com_fd,tmp_r,1024);}exit(0);}〃回到父进程if(pid>0){wait(0);close(com_fd);//关闭通信套接字continue;}}intDataSend(char*service,char*dest,charsed_buf[1024],charrcv_buf[1024])//参数为服务端口端口号和主机名及需要发送的数据{structhostent*hp;//服务地址structsockaddr_insin;//指明连接地址信息structservent*sp;//服务端口ints;//连接描述符〃获取服务端口号if((sp=getservbyname(service,"tcp"))==NULL){fprintf(stderr,"Error:getservbyname");exit(-5);}〃获取目的主机if((hp=gethostbyname(dest))==0){fprintf(stderr,"Error:gethostbyname");exit(-6);}〃初始化服务套接字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){fprintf(stderr,"Error:socket");exit(-6);}if(connect(s,&sin,sizeof(sin))==-1){fprintf(stderr,"Error:connect");close(s);exit(-6);}〃发送数据//fprintf(stderr,"%sissendingrequestmessage:%s\n",argv[0],sed_buf);if(write(s,sed_buf,1024)!=1024)//toserver{fprintf(stderr,"WriteSocketsERROR\n!");close(s);exit(-1);}if(read(s,rcv_buf,1025)==0)//getreplayfromserver{fprintf(stderr,"ReadSocketsError\n");close(s);exit(-2);}printf("%s\n",rcv_buf);//printf("%sgetreply:%s\n",argv[0],sed_buf);close(s);}}intlog(char*filepath,char*buff){intfd;time_tt=time(0);chartmp[64];strftime(tmp,sizeof(tmp),"%Y/%m/%d%X%A",localtime(&t));if((fd=open(filepath,O_WRONLYIO_CREATIO_APPEND,0644))==-1){fprintf(stderr,"Logfile%sopenerror!\a\n",log);exit(-1);}write(fd,tmp,strlen(tmp));write(fd,":",2);write(fd,buff,strlen(buff));write(fd,"\n",2);close(fd);}银行端:intlog(char*filepath,char*buff){intfd;time_tt=time(0);chartmp[64];strftime(tmp,sizeof(tmp),"%Y/%m/%d%X%A",localtime(&t));if((fd=open(filepath,O_WRONLYIO_CREATIO_APPEND,0644))==-1){fprintf(stderr,"Logfile%sopenerror!\a\n",log);exit(-1);}write(fd,tmp,strlen(tmp));write(fd,":",2);write(fd,buff,strlen(buff));write(fd,"\n",2);close(fd);}intmain(intargc,char*argv[]){intlog(char*filepath,char*buff);charlog_file[10]="bank.log";charlog_buf[1024];intfd;//日志文件描述符〃网络通信信息intlisten_fd;//监听套接字描述符intcom_fd;//通信套接字描述符intlen;//请求方地址长度intret;pid_tpid;//处理请求进程idstructservent*sp;//存放服务器端口信息,从services文件读取structsockaddr_insrv_addr;//服务器地址structsockaddr_inclt_addr;//客户端地址listen_fd=socket(PF_INET,SOCK_STREAM,0);/创建监听套接字〃数据库连接信息MYSQLmysql;//MySQL连接MYSQL_ROWrow;//结果的行MYSQL_RES*result;//查询结果charmyl_buf[1024];//存放sql语句〃初始化网络连接参数if(listen_fd<0)perror(-创建监听套接字失败,');strcat(log_buf,”创建监听套接字失败”);log(log_file,log_buf);return1;}//从services文件中获取服务器端口号if((sp=getservbyname(argv[1],"tcp"))==NULL){fprintf(stderr,"参数错误”);exit(-5);}memset(&srv_addr,0,sizeof(srv_addr));//将srv_addr初始化为全0〃设定地址参数srv_addr.sin_family=AF_INET;srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);srv_addr.sin_port=sp->s_port;〃绑定服务套接字ret=bind(listen_fd,(structsockaddr*)&srv_addr,sizeof(srv_addr));if(ret==-1){perror("绑定服务套接字失败”);strcat(log_buf,”绑定服务套接字失败");log(log_file,log_buf);close(listen_fd);return1;}〃监听客户连接ret=listen(listen_fd,1024);if(ret==-1){perror(-监听客户请求失败,');strcat(log_buf,”监听客户请求失败”);log(log_file,log_buf);close(listen_fd);return1;}〃连接users数据库if(mysql_init(&mysql)==NULL){fprintf(stderr,"数据连接初始失败”);strcat(log_buf,”数据连接初始失败”);log(log_file,log_buf);exit(-1);}if(!mysql_real_connect(&mysql,"localhost”,"root”,0,"bank”,0,NULL,0)){fprintf(stderr,"数据库连接错误:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_close(&mysql);exit(-2);}〃开始接受客户请求printf("等待客户连接\n");while(1){len=sizeof(clt_addr);com_fd=accept(listen_fd,(structsockaddr*)&clt_addr,&len);if(com_fd<0){perror("接受客户端连接请求失败,');strcat(log_buf,”接受客户端连接请求失败");log(log_file,log_buf);close(listen_fd);return1;}if((pid=fork())==-1){printf(-开创进程失败,,);return1;}〃创建子进程成功if(pid==0){close(listen_fd);//关闭监听套接字〃处理接受到的数据charsend_buf[1024];intlen;if(len=read(com_fd,send_buf,1024)>0){if(send_buf[0]=='G'){printf(-收到充值请求,信息如下\n");printf("%s\n",send_buf);printf("银行账号%s\n”,send_buf+2);printf("银行密码%s\n”,send_buf+21);printf("充值金额%s\n”,send_buf+31);〃更新数据库sprintf(myl_buf,"select*frombankwherenumber=\"%s\"",send_buf+2);if(mysql_query(&mysql,myl_buf)!=0){fprintf(stderr,"数据查询错误:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_close(&mysql);exit(-3);}if((result=mysql_store_result(&mysql))==NULL){fprintf(stderr,"存放数据失败:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_free_result(result);mysql_close(&mysql);exit(-4);};if((mysql_num_rows(result))==0){printf("用户不存在!\n");strcat(log_buf,"用户不存在!”);log(log_file,log_buf);}row=mysql_fetch_row(result);if(strcmp(row[1],send_buf+21)!=0){printf("密码错误\n");}else{floatmoney;money=atof(row[3])-atof(send_buf+31);printf("余额变更为:%f\n",money);if(money>=0){charbuff[1024];sprintf(myl_buf,"updatebanksetmoney=%fwherenumber=\"%s\"”,money,row[0]);if(mysql_query(&mysql,myl_buf)!=0){fprintf(stderr,"数据查询错误:%s[%d]\n”,mysql_error(&mysql),mysql_errno(&mysql));mysql_close(&mysql);exit(-3);}else{printf("更新成功!!");}memcpy(buff,"H”,2);memcpy(buff+2,"O”,2);write(com_fd,buff,1024);}}}if(send_buf[0]=='E'){printf("收到银行查询,信息如下\n");printf("%s\n",send_buf);printf("银行账号:%s\n”,send_buf+2);printf("银行密码:%s\n",send_buf+21);charnumber[19];//银行账号charpassword[10];//密码charname[30];//户主姓名sprintf(myl_buf,"select*frombankwherenumber=\"%s\"",send_buf+2);if(mysql_query(&mysql,myl_buf)!=0){fprintf(stderr,"数据查询错误:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_close(&mysql);exit(-3);}if((result=mysql_store_result(&mysql))==NULL){fprintf(stderr,"存放数据失败:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_free_result(result);mysql_close(&mysql);exit(-4);};if((mysql_num_rows(result))==0){printf("用户不存在!\n");strcat(log_buf,"用户不存在!”);log(log_file,log_buf);}row=mysql_fetch_row(result);if(strcmp(row[1],send_buf+21)!=0){printf("密码错误\n");strcat(log_buf,"密码错误!");log(log_file,log_buf);}else{printf("%s\n",row⑵);printf("%s\n",row[0]);printf("%s\n”,row[3]);chartmp[1024];memcpy(tmp,"B”,2);memcpy(tmp+2,"B”,2);memcpy(tmp+4,"O”,2);memcpy(tmp+6,row[2],30);memcpy(tmp+36,row[0],19);memcpy(tmp+55,row[3],20);write(com_fd,tmp,1024);printf("%i”,sizeof(tmp));close(com_fd);}}}exit(0);}〃回到父进程if(pid>0){wait(0);close(com_fd);//关闭通信套接字continue;}}}手机端:intlog(char*filepath,char*buff){intfd;time_tt=time(0);chartmp[64];strftime(tmp,sizeof(tmp),"%Y/%m/%d%X%A",localtime(&t));if((fd=open(filepath,O_WRONLYIO_CREATIO_APPEND,0644))==-1){fprintf(stderr,"Logfile%sopenerror!\a\n",log);exit(-1);}write(fd,tmp,strlen(tmp));write(fd,":",2);write(fd,buff,strlen(buff));write(fd,"\n",2);close(fd);}intmain(intargc,char*argv[]){intlog(char*filepath,char*buff);charlog_file[10]="phone.log";charlog_buf[1024];//网络通信信息intfd;//日志文件描述符intlisten_fd;//监听套接字描述符intcom_fd;//通信套接字描述符intlen;//请求方地址长度intret;pid_tpid;//处理请求进程idstructservent*sp;//存放服务器端口信息,从services文件读取structsockaddr_insrv_addr;//服务器地址structsockaddr_inclt_addr;//客户端地址listen_fd=socket(PF_INET,SOCK_STREAM,0);/创建监听套接字charbuff[1024];〃数据库连接信息MYSQLmysql;//MySQL连接MYSQL_ROWrow;//结果的行MYSQL_RES*result;//查询结果charmyl_buf[1024];//存放sql语句〃初始化网络连接参数if(listen_fd<0){perror("创建监听套接字失败,');strcat(log_buf,"创建监听套接字失败");log(log_file,log_buf);return1;}//从services文件中获取服务器端口号if((sp=getservbyname(argv[1],"tcp"))==NULL){fprintf(stderr,"参数错误”);exit(-5);}memset(&srv_addr,0,sizeof(srv_addr));//将srv_addr初始化为全0〃设定地址参数srv_addr.sin_family=AF_INET;srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);srv_addr.sin_port=sp->s_port;〃绑定服务套接字ret=bind(listen_fd,(structsockaddr*)&srv_addr,sizeof(srv_addr));if(ret==-1){perror("绑定服务套接字失败”);strcat(log_buf,”绑定服务套接字失败");log(log_file,log_buf);close(listen_fd);return1;}ret=listen(listen_fd,1024);〃监听客户连接if(ret==-1){perror(-监听客户请求失败,');strcat(log_buf,”监听客户请求失败”);log(log_file,log_buf);close(listen_fd);return1;}if(mysql_init(&mysql)==NULL)〃连接users数据库{fprintf(stderr,"数据连接初始失败”);strcat(log_buf,”数据连接初始失败”);log(log_file,log_buf);exit(-1);}if(!mysql_real_connect(&mysql,"localhost”,"root”,0,"phone”,0,NULL,0)){fprintf(stderr,"数据库连接错误:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));strcat(log_buf,"数据库连接错误");log(log_file,log_buf);mysql_close(&mysql);exit(-2);}〃开始接受客户请求printf("等待客户连接\n");while(1){len=sizeof(clt_addr);com_fd=accept(listen_fd,(structsockaddr*)&clt_addr,&len);if(com_fd<0){perror("接受客户端连接请求失败,');strcat(log_buf,”接受客户端连接请求失败");log(log_file,log_buf);close(listen_fd);return1;}if((pid=fork())==-1){printf(-开创进程失败,,);strcat(log_buf,”开创进程失败”);log(log_file,log_buf);return1;}〃创建子进程成功if(pid==0){close(listen_fd);//关闭监听套接字charsend_buf[1024];intlen;if(len=read(com_fd,send_buf,1024)>0){if(send_buf[0]=='G'){printf(-收到缴费请求,信息如下\n");printf("%s\n",send_buf);printf("手机号码%s\n”,send_buf+2);printf('缴费金额%s\n”,send_buf+17);sprintf(myl_buf,"select*fromphonewherenumber=\"%s\"",send_buf+2);if(mysql_query(&mysql,myl_buf)!=0){fprintf(stderr,"数据查询错误:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_close(&mysql);memcpy(buff,"H”,2);memcpy(buff+2,"E”,2);memcpy(buff+4,”银行服务器错误”,14);exit(-3);}if((result=mysql_store_result(&mysql))==NULL){fprintf(stderr,”存放数据失败:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_free_result(result);mysql_close(&mysql);exit(-4);memcpy(buff,"H”,2);memcpy(buff+2,"E”,2);memcpy(buff+4,”银行服务器错误”,20);strcat(log_buf,”银行服务器错误");log(log_file,log_buf);};row=mysql_fetch_row(result);if((mysql_num_rows(result))==0){printf("手机号码不存在!\n");memcpy(buff,"H”,2);memcpy(buff+2,"E”,2);memcpy(buff+4,"手机号码不存在!”,20);strcat(log_buf,"手机号码不存在!”);log(log_file,log_buf);}else{floatmoney;money=atof(row[2])+atof(send_buf+17);if(money>=0){printf(”余额变更为:%f\n",money);sprintf(myl_buf,"updatephonesetmoney=%fwherenumber=\"%s\"”,money,row[0]);if(mysql_query(&mysql,myl_buf)!=0){fprintf(stderr,"数据查询错误:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_close(&mysql);exit(-3);}else{printf("更新成功\n");memcpy(buff,"H”,2);memcpy(buff+2,"O”,2);}}}//printf('错误信息:%s\n”,buff+4);write(com_fd,buff,1024);}}if(send_buf[0]=='E'){printf("收到手机余额查询,信息如下\n");printf("%s\n",send_buf);printf("手机号码:%s\n",send_buf+2);charnumber[19];//银行账号charname[30];//户主姓名sprintf(myl_buf,"select*fromphonewherenumber=\"%s\"”,send_buf+2);if(mysql_query(&mysql,myl_buf)!=0){fprintf(stderr,"数据查询错误:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_close(&mysql);memcpy(buff,"F",2);memcpy(buff+2,"E”,2);memcpy(buff+4,”服务器错误”,14);exit(-3);}if((result=mysql_store_result(&mysql))==NULL){fprintf(stderr,"存放数据失败:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_free_result(result);mysql_close(&mysql);exit(-4);memcpy(buff,"F",2);memcpy(buff+2,"E”,2);memcpy(buff+4,”服务器错误”,20);};row=mysql_fetch_row(result);if((mysql_num_rows(result))==0){strcat(log_buf,"用户不存在!");log(log_file,log_buf);printf("用户不存在!\n");memcpy(buff,"F",2);memcpy(buff+2,"E”,2);memcpy(buff+4,',用户不存在!",20);}else{printf("%s\n",row[0]);printf("%s\n",row[1]);printf("%s\n",row⑵);memcpy(buff,"B",2);memcpy(buff+2,"P",2);memcpy(buff+4,"O",2);memcpy(buff+6,row[0],15);memcpy(buff+21,row[1],30);memcpy(buff+57,row[2],20);//sprintf(tmp+55,"%s”,row[3]);}write(com_fd,buff,1024);}exit(0);}if(pid>0){wait(0);close(com_fd);//关闭通信套接字continue;}}}客户端:intlog(char*filepath,char*buff){intfd;time_tt=time(0);chartmp[64];strftime(tmp,sizeof(tmp),"%Y/%m/%d%X%A",localtime(&t));if((fd=open(filepath,O_WRONLYIO_CREATIO_APPEND,0644))==-1){fprintf(stderr,"Logfile%sopenerror!\a\n",log);exit(-1);}write(fd,tmp,strlen(tmp));write(fd,":",2);write(fd,buff,strlen(buff));write(fd,"\n”,2);close(fd);}intmain(intargc,char*argv[]){intlog(char*filepath,char*buff);charlog_buf[1024];intfd;//日志文件描述符charlog_file[10]="clt.log”;//日志文件charuser[20];//用户,用于登陆客户端charuser_p[10];//密码,用户登陆客户端charpname[20];//机主姓名charphone[15];//手机号码floatphone_m;//手机余额charbname[20];//银行账号中名字charnumber[19];//银行账号charpassword[10];//银行密码floatbank_m;〃银行账户余额charmoney[20];//充值金额MYSQLmysql;//MySQL连接MYSQL_ROWrow;//结果的行MYSQL_RES*result;//查询结果charmyl_buf[1024];//存放sql语句charsend_buf[1024];//发送缓冲charrecive_buf[1024];//接收缓冲intconnect_fd;//连接描述符intlen;structservent*sp;//服务端口信息structhostent*hp;//服务器地址intret;staticstructsockaddr_insrv_addr;〃连接users数据库if(mysql_init(&mysql)==NULL){fprintf(stderr,"数据连接初始失败”);exit(-1);}if(!mysql_real_connect(&mysql,"localhost”,"root”,0,"users”,0,NULL,0)){fprintf(stderr,"数据库连接错误:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_close(&mysql);exit(-2);}system("clear");login:printf(-请输入用户名:\n");scanf("%s",user);printf("请输入密码:\n");scanf("%s”,user_p);〃验证用户名与密码sprintf(myl_buf,"select*fromuserswherename=\"%s\"”,user);if(mysql_query(&mysql,myl_buf)!=0){fprintf(stderr,"数据查询错误:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_close(&mysql);exit(-3);}if((result=mysql_store_result(&mysql))==NULL){fprintf(stderr,"存放数据失败:%s[%d]\n",mysql_error(&mysql),mysql_errno(&mysql));mysql_free_result(result);mysql_close(&mysql);exit(-4);};if((mysql_num_rows(result))==0){printf(”用户不存在!\n");gotologin;}row=mysql_fetch_row(result);if(strcmp(row[1],user_p)!=0){printf(”密码错误\n");gotologin;}system("clear");printf("%s登陆成功\n",user);interface:system("clear");if((sp=getservbyname(argv[1],"tcp"))==NULL){fprintf(stderr,"端口号获取错误,请检查第一个参数,并确保在services文件里有该参数,exit(-1);}if((hp=gethostbyname(argv[2]))==0){fprintf(stderr,呻间件地址获取失败,请检查第二个参数,并确保hosts文件里有对应项,exit(-2);}memset(&srv_addr,0,sizeof(srv_addr));srv_addr.sin_family=AF_INET;bcopy(hp->h_addr,&srv_addr.sin_addr,hp->h_length);srv_addr.sin_port=sp->s_port;connect_fd=socket(PF_INET,SOCK_STREAM,0);if(connect_fd<0){perror(-创建通信套接字失败,');return1;}ret=connect(connect_fd,(structsockaddr*)&srv_addr,sizeof(srv_addr));if(ret==-1){perror("无法连接到服务器");close(connect_fd);return1;}printf(-=========欢迎您使用手机缴费系统====\n");printf("1.给手机缴费2.查询银行账户\n");printf("3.查询手机余额4.退出系统n”);printf(-请选择数字操作:");charchoice;scanf("%s”,&choice);switch(choice){case'1':printf("");printf("请输入手机号码\^,);scanf("%s”,phone);printf("请输入银行账号\n");scanf("%s”,number);printf("请输入银行密码");scanf("%s”,password);printf("请输入缴费金额”);scanf("%s”,money);memcpy(send_buf,"C”,2);memcpy(send_buf+2,phone,15);memcpy(send_buf+17,number,19);memcpy(send_buf+36,password,10);memcpy(send_buf+46,money,20);printf(”以下为充值信息:\n");printf("%s\n",send_buf);printf("手机号码:%s\n",send_buf+2);printf("银行账户%s\n",send_buf+17);printf("充值金额%s\n",send_buf+46);write(connect_fd,send_buf,1024);if(len=read(connect_fd,recive_buf,1024)>0){printf("收到数据\n");TOC\o"1-5"\h\zprintf("充值成功!!\n");printf("按回车键返回\n");strcat(log_buf,”给手机缴费”);strcat(log_buf,"电话号码:”);strcat(log_buf,phone);strcat(log_buf,"");strcat(log_buf,”银行账号:");strcat(log_buf,number);strcat(log_buf,"");strcat(log_buf,"充值话费:");strcat(log_buf,money);log(log_file,log_buf);charstdinBuff[1024];fgets(stdinBuff,1024,stdin);getchar();gotointerface;}else{charstdinBuff[1024];fgets(stdinBuff,1024,stdin);printf("充值失败AAAAAA%s\n",recive_buf+4);printf("按回车键返回\n");strcat(log_buf,"电话号码:");strcat(log_buf,phone);strcat(log_buf,"账户不存在,充值失败!”);log(log_file,log_buf);getchar();gotointerface;}break;case'2':printf("");printf("请输入银行账号\n");scanf("%s",number);printf("请输入银行密码");scanf("%s",password);memcpy(send_buf,"A",2);memcpy(send_buf+2,"B",2);memcpy(send_buf+4,number,19);memcpy(send_buf+23,password,10);printf("以下为查询信息:\n");printf("%s\n",send_buf);printf("银行账户%s\n",send_buf+4);printf("密码%s\n”,send_buf+23);write(connect_fd,send_buf,1024);printf("发送数据成功。。\n");if(len=read(connect_fd,recive_buf,1024)>0){printf("收到数据\n"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农产品销售合同协议范本
- 招标文件房产项目
- 版短期无担保个人
- 第三方支付保证金协议
- 知识产权顾问合同的争议解决方法分享
- 学生健康饮食承诺保证书
- 装饰拆除改造合同
- 道具采购合同范本中文模板样式
- 导购员合同协议的交通补贴
- 幼儿园食品订购合同范本
- 电影作品解读-世界科幻电影智慧树知到期末考试答案章节答案2024年成都锦城学院
- NB-T47003.1-2009钢制焊接常压容器(同JB-T4735.1-2009)
- 聚焦高质量+探索新高度+-2025届高考政治复习备考策略
- 惠州市惠城区2022-2023学年七年级上学期期末教学质量检测数学试卷
- 北京市西城区2022-2023学年七年级上学期期末英语试题【带答案】
- ISO45001-2018职业健康安全管理体系之5-4:“5 领导作用和工作人员参与-5.4 工作人员的协商和参与”解读和应用指导材料(2024A0-雷泽佳)
- 看图猜成语共876道题目动画版
- 小学二年级上册数学-数角的个数专项练习
- 曲式与作品分析智慧树知到期末考试答案章节答案2024年兰州文理学院
- 园林设施维护方案
- 特种设备使用单位日管控、周排查、月调度示范表
评论
0/150
提交评论