为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

linux 手机缴费系统

2011-08-29 37页 doc 302KB 43阅读

用户头像

is_466699

暂无简介

举报
linux 手机缴费系统河南城建学院 前言  移动通信业务中,有一部分都是和手机缴费的业务相关,而手机缴费业务目前处于发展的阶段,手机缴费业务作为目前唯一的数据业务正在飞速发展中 近年来,随着中国市场经济的高速发展的情况下,社会上出现了很多新消费模式,由此移动通信行业衍生出很多新的业务,具体情况可以总结为以下几点:  这追求效率的时代,随着们生活水平的提高,消费项目,服务种类的增加,社会需要方便和快捷的缴费方式。在当今网络社会,技术成熟,发挥网络技术优势,利用网络实现快捷缴费已经成为可能。 利用电子商务网络以及众多的营业网点实时收费,在几乎不增加系统...
linux  手机缴费系统
河南城建学院 前言  移动通信业务中,有一部分都是和手机缴费的业务相关,而手机缴费业务目前处于发展的阶段,手机缴费业务作为目前唯一的数据业务正在飞速发展中 近年来,随着中国市场经济的高速发展的情况下,社会上出现了很多新消费模式,由此移动通信行业衍生出很多新的业务,具体情况可以总结为以下几点:  这追求效率的时代,随着们生活水平的提高,消费项目,服务种类的增加,社会需要方便和快捷的缴费方式。在当今网络社会,技术成熟,发挥网络技术优势,利用网络实现快捷缴费已经成为可能。 利用电子商务网络以及众多的营业网点实时收费,在几乎不增加系统负担的情况既可缓解目前收费单位营业厅的紧张状况,又方便用户缴费,提高了费用回收率。 手机缴费系统是基于UNIX Socket和MySQL数据库设计一个交易型中间件系统。在Linux环境下使用GNU C或者GNU C++,在Linux make开发工具的管理和控制下,利用Linux系统提供的Socket库和MySQL数据库在网络底层开发交易型中间件,同时简要介绍了客户端和服务器的工作模式。此模拟手机交费系统采用“客户端—中间件—服务器”模式,其中主要包括三大部分: 客户端(Client),中间件(Middleware)和服务器端(Server)。客户端(Client)主要实现用户管理、查询、交易(交费,购物等),撤销和统计等功能;中间件(Middleware)要完成与客户要求相符的功能——是本地的本地处理,否则发往服务器端——接受客户端数据,组织服务器端所需数据,重组服务端返回数据,并返回给客户方;服务器端(Server)主要实现客户端或中间件提出的业务请求并做好留迹工作。 本设计主要是利用UNIX系统提供的Socket库在网络底层,C语言,MySQL数据库,以及软件工程的思想和TCP/IP设计出的一个模拟手机交费中间件系统。 本设计包括了模拟手机交费系统的开发环境,设计目的,总体设计,详细设计,具体实现代码,以及设计中遇到的问题及解决方法。将服务器端(Server),中间件(Middleware)和客户端(Client)进行连接后可模拟出现实中手机交费的的功能。它可以实现手机费用查询,话费充值,打印花费清单详目等基本功能。 目录 TOC \o "1-3" \h \z \u 一、系统环境(硬件环境、软件环境) 3 二、计目的 3 三、体设计(程序设计组成框图、图、类图) 4 3.1程序设计组成框图: 4 3.2:中间件模型 5 3.3流程图 5 四、详细设计 7 4.1设计方法 7 4.2功能模块说明 7 五、调试与测试 9 5.1调试方法 9 5.2结果及简单分析 10 六、设计中遇到的问题及解决方法 10 七、源程序清单 11 八、总结,收获与体会 36 九、参考文献 37 一、系统环境(硬件环境、软件环境) 硬件环境:intel p4 3.06GHz 80G硬盘 软件环境:基于windows xp虚拟机下的Red Linux操作系统 二、计目的 本次设计的主要课题是:模拟手机缴费系统,通过对移动通信话费查询与缴费业务进行了系统全面的分析研究。针对现有系统中实时性不足而造成用户欠费太多使公司企业蒙受损失的问题。采用开发工具Linux+My进行系统设计。基于Uinx Socket和MySQL数据库,设计一个交易型中间件系统。提供通讯转发和转换的桥梁作用。例如电子商务、银行代理业务软件等都是这种类型软件。这里的中间件是指交易型中间件。交易型中间件是指用在不同行业、不同部门间的通讯转发和协议转换的软件,在不同的行业、不同的系统间。这里主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件。 本设计的目的是使参与设计者掌握利用软件工程的思想方法和TCP/IP设计出用于不同行业和部门间的通讯转发或协议转换软件—中间件,尤其掌握这种设计的思想和方法。本设计系统能够通过两种方式提供对移动话费信息输入、查询、编辑以及话费统计各明细项目的数据编辑,自动计算出花费的各项合计数据;可自主设定条件从而达到对话费数据的多角度查询功能;方便导入、导出数据及输出报。 三、体设计(程序设计组成框图、流程图、类图) 3.1程序设计组成框图: 实现工具及方法 基本功能 Linux +Mysql+ VMware Workstation 客 户 端 <----> 中 间 件 1.手机余额查询 客户端发送:头部(A)+ 目标(移动公司P)+手机号码(15) +机主姓名(30) 中间件发送:头部(B)+ 目标(移动公司P)+标志(O)+ 手机号码(15)+ 机主(30) +余额(20)或:头部(B)目标(移动公司P)+标志(E)+出错原因 2.银行账户余额查询: 客户端发送:头部(A)+目标(银行B)+银行账户(19)+密码(10) 中间件发送:头部(B)+目标(银行B)+标志(O)+户主(30)+账号(19)+余额(20)或:头部(B)+目标(银行B)+标志(E)+错误信息 3.手机充值 客户端发送:头部(C)+手机号码(15)+银行账户(19)+银行密码(10)+充值金额(20) 中间件发送:头部(D)+标志(O)或:头部(D)+标志(E)+错误原因 中 间 件 <----> 服 务 器 中间件 <---->银 行服务器 1.查询余额 中间件发送:头部(E)+银行账户(19)+密码(10) 服务器发送:头部(F)+标志(O)+银行账号(19)+用户名(30)+余额(20)或:头部(F)+标志(E)+出错原因 2.扣款 中间件发送:头部(G)+银行账户(19)+密码(10)+扣款金额(20) 服务器发送:头部(H)+标志(O)或:头部(H)+标志(E)+出错原因 中间件 <---->移 动服务器 1.查询余额 中间件发送:头部(E)+手机号码(15) 服务器发送:头部(F)+标志(O)+手机号码(15)+机主姓名(30)+余额(20)或:头部(F)+标志(E)+出错原因 2.缴费 中间件发送:头部(G)+手机号码(15)+缴费金额(20) 服务器发送:头部(H)+标志(O)或:头部(H)+标志(O)+出错原因 退出系统 当完成一次交易时,就可以退出系统。 3.2:中间件模型 3.3流程图 四、详细设计 4.1设计方法  在Linux环境下,使用GNU C或GNU C++,在UNIX/Linux make开发工具的的管理和控制下,利用UNIX/Linux Socket库在网络的底层进行开发设计。 4.2功能模块说明 本系统主要是由一个客户机,一个中间件以及两个服务器组成,两个服务器分别负责手机直接缴费和网上银行缴费。以下即是每个模块间的联系图: 请求1 请求2 返回 返回 请求服务 响应服务 请求数据 返回结果 (1)客户机:只负责发送和接收请求信息,此模块的目的就是将信息呈现给用户看,并提供相应的操作选择。此模块处理信息的过程较简单,原理如基本功能的现金支付所述,在此不再多做介绍。 (2)中间件:与客户机和服务器相连接,通过判断倒数第二个字符来判断选择哪个服务器,具体的是把客户端发来的信息转发给哪个服务器。通过服务器反馈回来信息的特殊字符来判断此信息是由哪个服务器发送而来。简单来说,中间件在整个分布式系统中起数据总线的作用,将各种异构系统通过中间件有机地结合成一个整体。 (3)服务器:本系统有两个服务器,手机服务器(S2)和银行服务器(S1) 1)手机服务器在这一部分,需要实现的功能是直接缴费。它的过程是接收从中间件过来的信息,在手机服务器的客户账户上相应加上对应的话费,即更新手机服务器数据库。更新成功直接之后,将缴费成功的信息传回中间件。具体流程如下: 现金缴纳话费工作流程图 注:直接现金缴纳,不需要通过银行服务器。从客户端开始流程,最后更新手机服务器数据库,即缴费成功。 2)银行服务器在银行服务器这一块,需要实现的功能是手机网上缴费。它的过程是接收从中间件过来的信息,在客户所输入的银行账户上扣除相应的手机费用;如果在手机的服务器那一块出现问题,缴费不成功,银行服务器还负责把之前所扣除的话费给加上,具体实现流程如下: 选择银行服务器后整个系统的工作流程图: 5 4 7 1 6 2 3 虚线表示在手机服务器出错,缴费失败,向银行服务器返回所交的话费。 五、调试与测试 5.1调试方法 (1)把数据库文件导入数据库 #mysql –u root ,加上后就正确了。 还有一个最可恶的问题,老是莫名奇妙的出现”段错误”,开始时摸不着头脑,就和同学一块商量,凭着各自了了的一点讨论,还好最后都解决了,主要时字符串末尾一定要加‘\0’,表示结束,否则可能是越界。 主要问题: (1)​ 对Mysql 数据库不够了解,对很多数据结构和算法也理解不够牢固,因此我们参考了《Linux+php+Mysql基础与提高》这本书,学到一些关于Mysql的基础知识,才使工作能顺利的进行下去。 (2)​ 对套接字这样的概念不是很清楚,在老师的辅导和互联网的帮助下,了解了一些这方面的知识,才使我们的设计开展下来。 (3)​ 以前对服务器,客户端只是了解理论知识,这次而要自己动手来开发服务器,这对我们来说,是一个巨大的挑战,服务器就是一个进程,确切的说是一个守候进程,要实现它的功能,是不容易的事情,你要学会套接字,地址转换,服务器相关的数据结构和算法才能进行开发和设计。 (4)​ 还是很多基础的东西没有掌握好,基本的算法也没有完全掌握,参考了教科书的相关内容后,才开始了我们的课程设计。 (5)​ 在数据库的编写时,很多要用到的数据类型而我们又没有学过的,只能借助互联网的强大功能了,由此,我们也学到了很多相关的知识。 七、源程序清单 中间件代码:#include #include #include #include #include #include #include #include #include #include #include int main(int argc,char *argv[]) { int log(char *filepath,char *buff ); char log_file[10]="mid.log"; char log_buf[1024]; //网络通信信息 int listen_fd;//监听套接字描述符 int com_fd;//通信套接字描述符 int len;//请求方地址长度 int ret; pid_t pid;//处理请求进程id struct servent *sp;//存放服务器端口信息,从services文件读取 struct sockaddr_in srv_addr;//服务器地址 struct sockaddr_in clt_addr;//客户端地址 listen_fd=socket(PF_INET,SOCK_STREAM,0);//创建监听套接字 //数据库连接信息 MYSQL mysql;//MySQL连接 MYSQL_ROW row;//结果的行 MYSQL_RES *result;//查询结果 char myl_buf[1024];//存放sql语句 //初始化网络连接参数 int DataSend(char *service,char *dest,char sed_buf[1024],char rcv_buf[1024]); if(listen_fd<0) { perror("创建监听套接字失败"); strcpy(log_buf,"创建监听套接字失败"); log(log_file,log_buf); return 1; } //从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,(struct sockaddr*)&srv_addr,sizeof(srv_addr)); if(ret==-1) { perror("绑定服务套接字失败"); strcpy(log_buf,"绑定服务套接字失败"); log(log_file,log_buf); close(listen_fd); return 1; } //监听客户连接 ret=listen(listen_fd,1024); if(ret==-1) { perror("监听客户请求失败"); strcpy(log_buf,"监听客户请求失败"); log(log_file,log_buf); close(listen_fd); return 1; }//连接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,(struct sockaddr*)&clt_addr,&len); if(com_fd<0) { perror("接受客户端连接请求失败"); strcpy(log_buf,"接受客户端连接请求失败"); log(log_file,log_buf); close(listen_fd); return 1; } if((pid=fork())==-1) { printf("开创进程失败"); strcpy(log_buf,"开创进程失败"); log(log_file,log_buf); return 1; } if(pid==0) //创建子进程成功 { close(listen_fd);//关闭监听套接字 //处理接受到的数据 char send_buf[1024]; int len; 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); char p_send[1024]; char p_rcv[1024]; char b_send[1024]; char b_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"); char t[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); } else if(p_rcv[2]=='E') { memcpy(t+2,"E",2); memcpy(t+4,p_rcv+4,50); write(com_fd,t,1024); } else if(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[2]=='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); char tmp[1024]; char tmp_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); } else if(send_buf[2]=='P') { printf("收到手机查询,信息如下\n"); printf("%s\n",send_buf); printf("%s\n",send_buf+2); printf("手机号码:%s\n",send_buf+4); char tmp[1024]; char tmp_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; } } int DataSend(char *service,char *dest,char sed_buf[1024],char rcv_buf[1024])//参数为服务端口端口号和主机名及需要发送的数据 { struct hostent *hp;//服务地址 struct sockaddr_in sin;//指明连接地址信息 struct servent *sp;//服务端口 int s;//连接描述符 //获取服务端口号 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,"%s is sending request message: %s\n",argv[0],sed_buf); if(write(s,sed_buf,1024)!=1024) //to server { fprintf(stderr,"Write Socket s ERROR\n!"); close(s); exit(-1); } if(read(s,rcv_buf,1025)==0) //get replay from server { fprintf(stderr,"Read Socket s Error\n"); close(s); exit(-2); } printf("%s\n",rcv_buf); //printf("%s get reply: %s\n",argv[0],sed_buf); close(s); } } int log(char *filepath,char *buff ) { int fd; time_t t = time(0); char tmp[64]; strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A ",localtime(&t) ); if((fd=open(filepath,O_WRONLY|O_CREAT|O_APPEND,0644))==-1) { fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } write(fd,tmp,strlen(tmp)); write(fd,":",2); write(fd,buff,strlen(buff)); write(fd,"\n",2); close(fd); } 银行端: int log(char *filepath,char *buff ) { int fd; time_t t = time(0); char tmp[64]; strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A ",localtime(&t) ); if((fd=open(filepath,O_WRONLY|O_CREAT|O_APPEND,0644))==-1) { fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } write(fd,tmp,strlen(tmp)); write(fd,":",2); write(fd,buff,strlen(buff)); write(fd,"\n",2); close(fd); } int main(int argc,char *argv[]) { int log(char *filepath,char *buff ); char log_file[10]="bank.log"; char log_buf[1024]; int fd;//日志文件描述符 //网络通信信息 int listen_fd;//监听套接字描述符 int com_fd;//通信套接字描述符 int len;//请求方地址长度 int ret; pid_t pid;//处理请求进程id struct servent *sp;//存放服务器端口信息,从services文件读取 struct sockaddr_in srv_addr;//服务器地址 struct sockaddr_in clt_addr;//客户端地址 listen_fd=socket(PF_INET,SOCK_STREAM,0);//创建监听套接字 //数据库连接信息 MYSQL mysql;//MySQL连接 MYSQL_ROW row;//结果的行 MYSQL_RES *result;//查询结果 char myl_buf[1024];//存放sql语句 //初始化网络连接参数 if(listen_fd<0) { perror("创建监听套接字失败"); strcat(log_buf,"创建监听套接字失败"); log(log_file,log_buf); return 1; } //从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,(struct sockaddr*)&srv_addr,sizeof(srv_addr)); if(ret==-1) { perror("绑定服务套接字失败"); strcat(log_buf,"绑定服务套接字失败"); log(log_file,log_buf); close(listen_fd); return 1; } //监听客户连接 ret=listen(listen_fd,1024); if(ret==-1) { perror("监听客户请求失败"); strcat(log_buf,"监听客户请求失败"); log(log_file,log_buf); close(listen_fd); return 1; } //连接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,(struct sockaddr*)&clt_addr,&len); if(com_fd<0) { perror("接受客户端连接请求失败"); strcat(log_buf,"接受客户端连接请求失败"); log(log_file,log_buf); close(listen_fd); return 1; } if((pid=fork())==-1) { printf("开创进程失败"); return 1; } //创建子进程成功 if(pid==0) { close(listen_fd);//关闭监听套接字 //处理接受到的数据 char send_buf[1024]; int len; 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 * from bank where number=\"%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 { float money; money=atof(row[3])-atof(send_buf+31); printf("余额变更为:%f\n",money); if(money>=0) { char buff[1024]; sprintf(myl_buf,"update bank set money=%f where number=\"%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); char number[19];//银行账号 char password[10];//密码 char name[30];//户主姓名 sprintf(myl_buf,"select * from bank where number=\"%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[2]); printf("%s\n",row[0]); printf("%s\n",row[3]); char tmp[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; } } } 手机端: int log(char *filepath,char *buff ) { int fd; time_t t = time(0); char tmp[64]; strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A ",localtime(&t) ); if((fd=open(filepath,O_WRONLY|O_CREAT|O_APPEND,0644))==-1) { fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } write(fd,tmp,strlen(tmp)); write(fd,":",2); write(fd,buff,strlen(buff)); write(fd,"\n",2); close(fd); } int main(int argc,char *argv[]) { int log(char *filepath,char *buff ); char log_file[10]="phone.log"; char log_buf[1024];//网络通信信息 int fd;//日志文件描述符 int listen_fd;//监听套接字描述符 int com_fd;//通信套接字描述符 int len;//请求方地址长度 int ret; pid_t pid;//处理请求进程id struct servent *sp;//存放服务器端口信息,从services文件读取 struct sockaddr_in srv_addr;//服务器地址 struct sockaddr_in clt_addr;//客户端地址 listen_fd=socket(PF_INET,SOCK_STREAM,0);//创建监听套接字 char buff[1024]; //数据库连接信息 MYSQL mysql;//MySQL连接 MYSQL_ROW row;//结果的行 MYSQL_RES *result;//查询结果 char myl_buf[1024];//存放sql语句 //初始化网络连接参数 if(listen_fd<0) { perror("创建监听套接字失败"); strcat(log_buf,"创建监听套接字失败"); log(log_file,log_buf); return 1; } //从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,(struct sockaddr*)&srv_addr,sizeof(srv_addr)); if(ret==-1) { perror("绑定服务套接字失败"); strcat(log_buf,"绑定服务套接字失败"); log(log_file,log_buf); close(listen_fd); return 1; } ret=listen(listen_fd,1024); //监听客户连接 if(ret==-1) { perror("监听客户请求失败"); strcat(log_buf,"监听客户请求失败"); log(log_file,log_buf); close(listen_fd); return 1; } 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,(struct sockaddr*)&clt_addr,&len); if(com_fd<0) { perror("接受客户端连接请求失败"); strcat(log_buf,"接受客户端连接请求失败"); log(log_file,log_buf); close(listen_fd); return 1; } if((pid=fork())==-1) { printf("开创进程失败"); strcat(log_buf,"开创进程失败"); log(log_file,log_buf); return 1; } //创建子进程成功 if(pid==0) { close(listen_fd);//关闭监听套接字 char send_buf[1024]; int len; 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 *from phone where number=\"%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 { float money; money=atof(row[2])+atof(send_buf+17); if(money>=0) { printf("余额变更为:%f\n",money); sprintf(myl_buf,"update phone set money=%f where number=\"%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); char number[19];//银行账号 char name[30];//户主姓名 sprintf(myl_buf,"select * from phone where number=\"%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_fet
/
本文档为【linux 手机缴费系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索