中国移动手机缴费管理系统

发布时间:2018-08-23 09:10:10   来源:文档文库   
字号:

河南大学

《信息分析与设计》设计说明书

设计题目:中国移动手机缴费管理系统

业: 信息管理与信息系统

指导教师:

级:

号:

名:

人:

计算机与信息工程学院

201012 21


前言

近年来,随着中国的市场经济的高速发展的情况下,社会上出现了很多新消费模式,由此移动通信行业衍生出很多新的业务,具体情况可总结为以下几点:
人们生活水平的提高,消费项目,服务种类的增加,产生了各种各样好收费项目。 在这追求效率的时代,社会需要方便和快捷的缴费方式。 通信行业竞争的日益激烈,移动通信的服务意识越来越高,通过各种服务吸引用户,已成为通信公司重要的竞争手段。在当今网络社会,技术成熟,发挥网络技术优势,利用网络实现快捷缴费已经成为可能。 利用电子商务网络以及众多的营业网点实时收费,在几乎不增加系统负担的情况既可缓解目前收费单位营业厅的紧张状况,又方便用户缴费,提高了费用回收率。

目录

前言.................................................................................................1

系统环境…………………………………………………….........3

总体设计………………………………………………………….3

详细设计………………………………………………………….4

调试与测试……………………………………………………….8

设计中遇到的问题及解决方法………………………………10

源程序清单……………………………………………………….11

总结,收获与体会……………………………………………….28

参考文献…………………………………………………………28

手机缴费系统

一、 系统环境

Linux环境下,使用GNU CGNU C++,在UNIX/Linux make开发工具的的管理和控制下,利用UNIX/Linux Socket库在网络的底层进行开发设计。

二、 设计目的

对移动通信话费查询与缴费业务进行了系统全面的分析研究。针对现有系统中实时性不足而造成用户欠费太多使公司企业蒙受损失的问题。采用开发工具Linux+Mysql进行系统设计。基于UNIX SocketMySQL数据库,设计一个交易型中间件系统。提供通讯转发和协议转换的桥梁作用。例如电子商务、银行代理业务软件等都是这种类型软件这里的中间件是指交易型中间件。交易型中间件是指用在不同行业、不同部门间的通讯转发和协议转换的软的件,在不同的行业、不同的系统间。这里主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件。

本设计系统能够通过两种方式提供对移动话费信息输入、查询、编辑以及话费统计各明细项目的数据编辑,自动计算出话费的各项合计数据;可自主设定条件从而达到对话费数据的多角度查询功能;方便导入、导出数据及输出报表。

三、 总体设计

程序设计组成框图

1)中间件模型

2)流程图

四、 详细设计

1、基本功能

1.1现金支付

客户到操作台缴纳费用,选择现金支付方式后,输入用户的手机号码和欲交的话费,客户端根据用户提供的手机号码向中间件发送请求,中间件收到请求后,接收客户方数据;组织服务器S1方所需数据;重组服务方返回数据,并返回给客户方。

1.2网上缴费

客户到操作台缴纳费用,选择网上缴费方式后,输入用户的银行卡号、手机号码和欲交的花费,客户端根据用户提供的手机号码向中间件发送请求,中间件收到请求后,接收客户方数据;组织服务器S2方所需数据;重组服务方返回数据,并返回给客户方。

1.3查询

通过输入手机号码就可以得到手机用户的基本信息,包含用户名,手机号,手机余额。

1.4退出

2、函数说明

mysql_init(&mysql); // 初始化数据结构

mysql_real_connect(&mysql,"localhost","root",0,"mydb",0,NULL,0); //连接数据库

mysql_query(&mysql,"SELECT * FROM person");//执行查询语句mysql_query

result=mysql_store_result(&mysql); //保存结果

int socket(int domain, int type, int protocol);// 创建套接字

int bind(int sockfd,const struct sockaddr *my_addr, int addrlen);// 绑定本地地址

int listen(int s,int backlog);// 监听连接

int connect(int sockfd,const structct sockaddr * server_addr, socklen_t addrlen);

//建立本地系统和外部系统之间的连接

int accept(int s, struct sockaddr *addr, socklen_t addrlen);

// 服务器调用,从等待从编号为s的套接字上接受客户连接请求。

send()/writerecv()/read();//数据传输

struct servent *getservbyport(int port, const char *protocal);

//得到服务器端口号相关的数据结构

struct sockaddr_in {

short int sin_family; // AF_INET

unsigned short int sin_port; // port No.

struct in_addr sin_addr; // IP addr.

}// IP socket地址

3、模块介绍

本系统主要是由一个客户机,一个中间件以及两个服务器组成,两个服务器分别负责手机直接缴费和网上银行缴费。以下即是每个模块间的联系图:

总体联系图

1)客户机:只负责发送和接收请求信息,此模块的目的就是将信息呈现给用户看,并提供相应的操作选择。此模块处理信息的过程较简单,原理如基本功能的现金支付所述,在此不再多做介绍。

2)中间件:与客户机和服务器相连接,通过判断倒数第二个字符来判断选择哪个服务器,具体的是把客户端发来的信息转发给哪个服务器。通过服务器反馈回来信息的特殊字符来判断此信息是由哪个服务器发送而来。简单来说,中间件在整个分布式系统中起数据总线的作用,将各种异构系统通过中间件有机地结合成一个整体。

3)服务器:本系统有两个服务器,手机服务器(S2)和银行服务器(S1

1)手机服务器

在这一部分,需要实现的功能是直接缴费。它的过程是接收从中间件过来的信息,在手机服务器的客户账户上相应加上对应的话费,即更新手机服务器数据库。更新成功直接之后,将缴费成功的信息传回中间件。具体流程如下:

现金缴纳话费工作流程图

注:直接现金缴纳,不需要通过银行服务器。从客户端开始流程,最后更新手机服务器数据库,即缴费成功。

2)银行服务器

在银行服务器这一块,需要实现的功能是手机网上缴费。它的过程是接收从中间件过来的信息,在客户所输入的银行账户上扣除相应的手机费用;如果在手机的服务器那一块出现问题,缴费不成功,银行服务器还负责把之前所扣除的话费给加上,具体实现流程如下:

选择银行服务器后整个系统的工作流程图

5

4

7

1 6

2 3

6:虚线表示在手机服务器出错,缴费失败,向银行服务器返回所交的话费。

六、 调试与测试

6.1 调试方法

(1)把数据库文件导入数据库

#mysql –u root

#mysql –u root

#mysql –u root

#mysql –u root

2)启动Mysql 数据(bank为例)

#show database;

#use bank;

#show tables;

#select * from information;

3)对程序进行编译连接

#gcc –o c1 c1.c –L/usr/lib/mysql -lmysqlclient

#gcc –o m1 m1.c –L/usr/lib/mysql -lmysqlclient

#gcc –o s1 s1.c –L/usr/lib/mysql -lmysqlclient

#gcc –o s2 s2.c –L/usr/lib/mysql -lmysqlclient

(4) 创建服务端口

#ivi /etc/services

进入新创建三个名字

zhongjr 500/tcp

worl 501/tcp

x 502/tcp

保存并退出vi

创建一个域名

#ivi /etc/hosts

进入新创建一个域名

192.168.117.5 www.x.com myhttp

保存并退出vi

(5) 运行程序

#./m1 x

切换到终端2

#./s1 world

切换到终端3

#./s2 zhongjr

切换到终端4

#./m1 x myhttp

6.2测试结果及简单分析

1、现金支付

缴费后手机服务器接受信息,对用户手机费用进行操作,操作后用户手机费用增加123元。

2、网上缴费

网上银行缴费,银行服务器与手机服务器都对信息有相应的操作,缴费得到确认成功后,银行卡上减去100元,手机话费加上100元。

3、查询

输入手机用户,查询用户的基本信息。信息“1|159********|zhongjr|1363.0000000000|0”相对应的意思是“ 操作类型|手机号|用户名|手机余额|终止传递信息”

4、客户日志文件

5、中间件日志文件


6、服务器日志文件

S1

S2

七、设计中遇到的问题及解决方法。

(1) Mysql 数据库不够了解,对很多数据结构和算法也理解不够牢固,因此我们参考了《Linux+php+Mysql基础与提高》这本书,学到一些关于Mysql的基础知识,才使工作能顺利的进行下去。

(2) 对套接字这样的概念不是很清楚,在老师的辅导和互联网的帮助下,了解了一些这方面的知识,才使我们的设计开展下来。

(3) 以前对服务器,客户端只是了解理论知识,这次而要自己动手来开发服务器,这对我们来说,是一个巨大的挑战,服务器就是一个进程,确切的说是一个守候进程,要实现它的功能,是不容易的事情,你要学会套接字,地址转换,服务器相关的数据结构和算法才能进行开发和设计。

(4) 还是很多基础的东西没有掌握好,基本的算法也没有完全掌握,参考了教科书的相关内容后,才开始了我们的课程设计。

(5) 在数据库的编写时,很多要用到的数据类型而我们又没有学过的,只能借助互联网的强大功能了,由此,我们也学到了很多相关的知识。

八、源程序清单

客户机以及两个服务器都会用到strsplit()函数,作用是分解字符串。

void strsplit(char *s,char **v,char d)

{

int i,j,l;

j=0;v[j]=s;

l=strlen(s);

for(i=0;i

if(*(s+i)!='|') continue;

else {

*(s+i)='\0';

v[++j]=s+i+1;

}

}

}

以下是每个模块中将实现其功能的部分重要代码。

1、 客户机

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL)

int set_disp_mode(int option);

int getpasswd(char* passwd, int size);

int main(int argc,char *argv[])

{

int choose;

char name[10],passwd[10];

char send_buf[1024]="";

char tmp[1024],phone[30],number[30],pswd[10],money[30],myl_buf[1024],fd_buf[1024];

char log[]="clt.log";

int connect_fd;

int ret;

int i;

int port;

int len;

int fd;

MYSQL mysql;

MYSQL_ROW row;

MYSQL_RES *result;

struct servent *sp;

struct hostent *hp;

static struct sockaddr_in srv_addr;

if(mysql_init(&mysql)==NULL){

fprintf(stderr,"Error in mysql_init!\n");

exit(-1);

}

if(!mysql_real_connect(&mysql,"localhost","root",0,"users",0,NULL,0)){

fprintf(stderr,"Error in connection: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_close(&mysql); exit(-2);

}

system("clear");

clear:

printf("Enter the user name:");

scanf("%s",name);

getchar();

set_disp_mode(0);

getpasswd(passwd,sizeof(passwd));

set_disp_mode(1);

system("clear");

sprintf(myl_buf,"select * from users where name=\"%s\"",name);

if(mysql_query(&mysql,myl_buf)!=0){

fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_close(&mysql); exit(-3);

}

if((result=mysql_store_result(&mysql))==NULL){

fprintf(stderr,"Error in store_result: %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("use dont exist!\n");

goto clear;

}

row=mysql_fetch_row(result);

if(strcmp(row[1],passwd)!=0){

printf("The passwd is not ture\n");

goto clear;

}

if((sp=getservbyname(argv[1],"tcp"))==NULL){

fprintf(stderr,"Error:getservbyname");

exit(-1);

}

if((hp=gethostbyname(argv[2]))==0){

fprintf(stderr,"Error:gethostbyname");

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;

clen:

connect_fd=socket(PF_INET,SOCK_STREAM,0);

if(connect_fd<0){

perror("cannot create communication socket");

return 1;

}

ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));

if(ret==-1){

perror("cannot connect to the server");

close(connect_fd);

return 1;

}

system("clear");

printf("%s login sucessfully\n",name);

printf("1.cash 2.online\n");

printf("3.search 4.exit\n");

printf("Please choose your option :");

scanf("%d",&choose);

switch(choose){

case 1:

printf("Please input your telephone number: ");

scanf("%s",phone);

printf("Please input the money you want to submit:");

scanf("%s",money);

getchar();

strcat(send_buf,"3|");strcat(send_buf,phone);strcat(send_buf,"|");

strcat(send_buf,money);strcat(send_buf,"|1|");

break;

case 2:

printf("Please input your phone number:");

scanf("%s",phone);

printf("Please input your bank number:");

scanf("%s",number);

getchar();

set_disp_mode(0);

getpasswd(pswd,sizeof(pswd));

set_disp_mode(1);

printf("\n");

printf("Please input the money you want to submit:");

scanf("%s",money);

getchar();

strcat(send_buf,"1|");strcat(send_buf,number);strcat(send_buf,"|");

strcat(send_buf,pswd);strcat(send_buf,"|");

strcat(send_buf,money);strcat(send_buf,"|");

strcat(send_buf,phone);strcat(send_buf,"|");

strcat(send_buf,"2|");

break;

case 3:

printf("Please Enter your phone number:");

scanf("%s",phone);

getchar();

strcat(send_buf,"4|");strcat(send_buf,phone);

strcat(send_buf,"|1|");

break;

case 4:

strcpy(send_buf,"3|");

break;

default:

printf("Please Enter 1,2,3,4!!!!!\n");

printf("Enter Any key to continue...");

getchar();

goto clen;

}

write(connect_fd,send_buf,strlen(send_buf)+1);

len=read(connect_fd,send_buf,1024);

close(connect_fd);

switch(send_buf[0]){

case '0':

if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){

fprintf(stderr,"Log file %s open error!\a\n",log);

exit(-1);

}

sprintf(fd_buf,"%-10s%-20s%-20s[0k]\n",name,phone,money);

write(fd,fd_buf,strlen(fd_buf));

close(fd);

printf("OPTION SUCCESSFULLY\n");

printf("Please Enter any key to return...\n");

getchar();

strcpy(send_buf,"");

goto clen;

break;

case '1':

printf("the information of the is %s\n",send_buf);

printf("Please Entry any key to continue...\n");

strcpy(send_buf,"");

getchar();goto clen;

break;

case '3':

if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){

fprintf(stderr,"Log file %s open error!\a\n",log);

exit(-1);

}

sprintf(fd_buf,"%s LOG OUT SUCESSFULLY",phone);

write(fd,fd_buf,strlen(fd_buf));

close(fd);

printf("SUCCESSFULLY LOGOUT!\n");

break;

case '5':

if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){

fprintf(stderr,"Log file %s open error!\a\n",log);

exit(-1);

}

sprintf(fd_buf,"%-10s%-20s%-20s[FALSE] BANK NUMBER WRONG!\n",name,phone,money);

write(fd,fd_buf,strlen(fd_buf));

close(fd);

printf("THE BANK NUMBER IS NOT EXIST\n");

printf("Please Check it\n");

printf("please Enter any key to continue...\n");

getchar();

strcpy(send_buf,"");goto clen;

case '8':

if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){

fprintf(stderr,"Log file %s open error!\a\n",log);

exit(-1);

}

sprintf(fd_buf,"%-10s%-20s%-20s[FALSE] PHONE NUMBER WRONG!\n",name,phone,money);

write(fd,fd_buf,strlen(fd_buf));

close(fd);

printf("THE PHONE USER ISN'T EXIST\n");

printf("Please Check it\n");

printf("Please Enter any key to continue...\n");

getchar();

strcpy(send_buf,"");goto clen;

break;

case '9':

if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){

fprintf(stderr,"Log file %s open error!\a\n",log);

exit(-1);

}

sprintf(fd_buf,"%-10s%-20s%-20s[FALSE] BANK PASSWD WRONG!\n",name,phone,money);

write(fd,fd_buf,strlen(fd_buf));

close(fd);

printf("The passwd wrong\n");

printf("Please Enter any key to continue...\n");

getchar();

strcpy(send_buf,"");goto clen;

case '7':

if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){

fprintf(stderr,"Log file %s open error!\a\n",log);

exit(-1);

}

sprintf(fd_buf,"%-10s%-20s%-20s[FALSE] NOT ENOUGH!\n",name,phone,money);

write(fd,fd_buf,strlen(fd_buf));

close(fd);

printf("NOt Enough MOney\n");

printf("Please Enter any key to continue...\n");

getchar();

strcpy(send_buf,"");goto clen;

default:break;

}

close(connect_fd);

return 0;

}

int set_disp_mode(int option)

{

int err;

struct termios term;

if(tcgetattr(STDIN_FILENO,&term)==-1){

perror("Cannot get the attribution of the terminal");

return 1;

}

if(option)

term.c_lflag|=ECHOFLAGS;

else

term.c_lflag &=~ECHOFLAGS;

err=tcsetattr(STDIN_FILENO,TCSAFLUSH,&term);

if(err==-1 && err==EINTR){

perror("Cannot set the attribution of the terminal");

return 1;

}

return 0;

}

int getpasswd(char* passwd, int size)

{

int c;

int n = 0;

printf("Enter the passwd:");

do{

c=getchar();

// if (c != '\n'|c!='\r'){

passwd[n++] = c;

// }

}while(c != '\n' && c !='\r' && n < (size - 1));

passwd[n-1] = '\0';

return n;

}

2、中间件

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

void strsplit(char *s,char **v,char d);

int main(int argc,char *argv[])

{

int listen_fd,clt_fd,ser_fd;

int com_fd;

int ret;

int i;

int port;

int stat;

pid_t pid;

char flag,fflag;

static char recv_buf[1024],snd_buf[1024],buf[1024],ret_buf[1024]="",fd_buf[1024]="";

int len;

char **v,**x,d='|';

int fd;

char log[]="mid.log";

MYSQL mysql;

MYSQL_RES *result;

MYSQL_ROW row;

struct hostent *hp;

struct servent *sp;

struct sockaddr_in srv_addr;

struct sockaddr_in clt_addr;

struct sockaddr_in sc_addr;

if(mysql_init(&mysql)==NULL){

fprintf(stderr,"Error in mysql_init!\n");

exit(-1);

}

if(!mysql_real_connect(&mysql,"localhost","root",0,"middle",0,NULL,0)){

fprintf(stderr,"Error in connection: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_close(&mysql); exit(-2);

}

listen_fd=socket(PF_INET,SOCK_STREAM,0);

if(listen_fd<0){

perror("cannot create listening socket");

return 1;

}

if((sp=getservbyname(argv[1],"tcp"))==NULL){

fprintf(stderr,"Error:getservbyname");

exit(-1);

}

memset(&srv_addr,0,sizeof(srv_addr));

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("cannot bind server socket");

close(listen_fd);

return 1;

}

ret=listen(listen_fd,10);

if(ret==-1){

perror("cannot listen the client connect request");

close(listen_fd);

return 1;

}

while(1){

flag='F',fflag='T';

len=sizeof(clt_addr);

com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);

if(com_fd<0){

perror("cannot accept client connect request");

close(listen_fd);

return 1;

}

if((pid=fork())==-1){

printf("can't create son proce!\n");

close(com_fd);

close(listen_fd);

return 2;

}

if(pid==0){

close(listen_fd);

if((len=read(com_fd,recv_buf,1024))>0){

if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){

fprintf(stderr,"Log file %s open error!\a\n",log);

exit(-1);

}

sprintf(fd_buf,"MESSAGE FROM CLIENT:%-40s\n",recv_buf);

write(fd,fd_buf,strlen(fd_buf)+1);

}

if(recv_buf[len-3]=='3'){

strcpy(snd_buf,"3|");

goto zhongjr;

}

clen:

len=strlen(recv_buf);

sprintf(buf,"select * from information where service=%d",(recv_buf[len-2]-48));

if(mysql_query(&mysql,buf)!=0){

fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_close(&mysql); exit(-3);

}

if((result=mysql_store_result(&mysql))==NULL){

fprintf(stderr,"Error in store_result: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_free_result(result);mysql_close(&mysql); exit(-4);

}

row=mysql_fetch_row(result);

if((sp=getservbyname(row[1],"tcp"))==NULL){

fprintf(stderr,"Error:getservbyname");

exit(-3);

}

if((hp=gethostbyname(row[2]))==0){

fprintf(stderr,"Error:gethostbyname");

exit(-4);

}

clt_fd=socket(PF_INET,SOCK_STREAM,0);

if(clt_fd<0){

perror("cannot create communication socket");

return 3;

}

memset(&sc_addr,0,sizeof(sc_addr));

sc_addr.sin_family=AF_INET;

bcopy(hp->h_addr,&sc_addr.sin_addr,hp->h_length);

sc_addr.sin_port=sp->s_port;

if((connect(clt_fd,(struct sockaddr*)&sc_addr,sizeof(sc_addr)))==-1){

perror("cannot connect to the server");

close(clt_fd);

return 4;

}

memset(snd_buf,0,1024);

strncpy(snd_buf,recv_buf,len-2);

write(clt_fd,snd_buf,len);

read(clt_fd,snd_buf,1024);

close(clt_fd);

switch(recv_buf[len-2])

{

case '0':

break;

case '1'://中间件返回

if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){

fprintf(stderr,"Log file %s open error!\a\n",log);

exit(-1);

}

sprintf(fd_buf,"MESSAGE FROM PHONE:%-40s\n",snd_buf);

write(fd,fd_buf,strlen(fd_buf)+1);

close(fd);

if(snd_buf[0]=='8'){

snd_buf[0]='2';

strcpy(recv_buf,snd_buf);

strcpy(snd_buf,"8|");

flag='T';

}

break;

case '2'://从银行回来还得再次处理 if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){

fprintf(stderr,"Log file %s open error!\a\n",log);

exit(-1);

}

sprintf(fd_buf,"MESSAGE FROM BANK:%-40s\n",snd_buf);

write(fd,fd_buf,strlen(fd_buf)+1);

close(fd);

if(snd_buf[0]=='0'){ strcpy(recv_buf,snd_buf);recv_buf[0]='2';

printf("recv_buf%s\n",recv_buf);goto clen;

}

if(snd_buf[0]=='6'){

goto withme;

}

break;

default :;

}

zhongjr:

if(fflag=='T'){

write(com_fd,snd_buf,strlen(snd_buf)+1);//给客户只写一次

fflag=='F';

}

withme:

if(flag=='T') {flag='F';goto clen;} //第二次goto执行的时候

close(com_fd);

exit(0);

}

if(pid>0){

close(com_fd);

continue;

}

}

}

3、银行服务器

在建立好了所有的连接之后,函数进入一个死循环,来处理其主要的功能

while(1){

len=sizeof(clt_addr);

com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);

//返回一个新的套接字,与申请连接的客户机进行连接

if(com_fd<0){ //服务器等待连接失败

perror("cannot accept client connect request");

close(listen_fd);

return 1;

}

if((pid=fork())==-1){ //建立子进程用来进行处理客户机的请求信息

printf("error !!!\n");

return 1;

}

if(pid==0){

close(listen_fd);

if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){

fprintf(stderr,"Log file %s open error!\a\n",log);

exit(-1);

}

len=read(com_fd,recv_buf,1024);

strncpy(save_buf,recv_buf,len-2);

strsplit(recv_buf,v,d);

sprintf(buf,"select * from information where number=\"%s\"",v[1]);

//buf存入需查询的sql语言信息

if(mysql_query(&mysql,buf)!=0){ //执行buf中的sql语句

fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_close(&mysql); exit(-3);

}

if((result=mysql_store_result(&mysql))==NULL){

fprintf(stderr,"Error in store_result: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_free_result(result);mysql_close(&mysql); exit(-4);

}

switch(v[0][0]){ //所存储的是客户机(中间件)发送过来的选择信号

case '1': //手机缴费成功,从银行账号中扣除话费

if((hang=mysql_num_rows(result))==0){

save_buf[0]='5'; //与客户机中的用户不存在对应

break; }

row=mysql_fetch_row(result);

if((strcmp(v[2],row[1]))!=0){

save_buf[0]='9';

break;

}

if((money=atof(row[3])-atof(v[3]))<0){

//将字符串转换为浮点型,账户钱不够缴费

save_buf[0]='7';

break;

}

else if(money>=0){ //将钱从银行卡中扣除后,更新银行数据库

sprintf(up_buf,"update information set money=%f where number=\"%s\"",money,row[0]);

if(mysql_query(&mysql,up_buf)!=0){

fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_close(&mysql); exit(-3);

}

sprintf(save_buf,"0|%s|%s|%s|1|",v[1],v[3],v[4]);

sprintf(fd_buf,"%-10s%-30s[DES]\n",v[1],v[3]);

write(fd,fd_buf,strlen(fd_buf)+1);

close(fd);

}

break;

case '2': //手机服务器出错,向银行账号中返回扣除的钱

row=mysql_fetch_row(result);

money=atof(row[3])+atof(v[2]);

sprintf(up_buf,"update information set money=%f where number=\"%s\"",money,row[0]);

if(mysql_query(&mysql,up_buf)!=0){

fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_close(&mysql); exit(-3);

}

sprintf(save_buf,"3|%s|1|",v[1]);

sprintf(fd_buf,"%-10s%-30s[ADD]\n",v[1],v[2]);

write(fd,fd_buf,strlen(fd_buf)+1);

close(fd);

break;

default:;

}

write(com_fd,save_buf,len);

close(fd);

close(com_fd); //关闭套接字

return 0;

}

4、手机服务器

建立连接成功后,程序进入一个循环过程。

while(1){

len=sizeof(clt_addr);

com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);

if(com_fd<0){

perror("cannot accept client connect request");

close(listen_fd);

return 1;

}

if((pid=fork())==-1){

printf("error !!!\n");

return 1;

}

if(pid==0){

close(fd);

if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){

fprintf(stderr,"Log file %s open error!\a\n",log);

exit(-1);

}

close(listen_fd);

if((len=read(com_fd,recv_buf,1024))>0)

printf("The information from mid %s \n",recv_buf);

strcpy(save_buf,recv_buf);

strsplit(recv_buf,v,d);

switch(v[0][0]){

case '2':

sprintf(buf,"select * from phone where number=\"%s\"",v[3]);

if(mysql_query(&mysql,buf)!=0){

fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_close(&mysql); exit(-3);

}

if((result=mysql_store_result(&mysql))==NULL){

fprintf(stderr,"Error in store_result: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_free_result(result);mysql_close(&mysql); exit(-4);

}

if((hang=mysql_num_rows(result))==0){

sprintf(fd_buf,"%-10s%-30s[FAILD] NOT EXIST\n",v[3],v[2]);

write(fd,fd_buf,strlen(fd_buf)+1);

close(fd);

sprintf(recv_buf,"8|%s|%s|2|",v[1],v[2]);

break;

}

row=mysql_fetch_row(result);

money=atof(row[2])+atof(v[2]); sprintf(up_buf,"update phone set money=%f where number=\"%s\"",money,row[0]);

if(mysql_query(&mysql,up_buf)!=0){

fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_close(&mysql); exit(-3);

}

sprintf(fd_buf,"%-10s%-30s[ADD]\n",v[3],v[2]);

write(fd,fd_buf,strlen(fd_buf)+1);

close(fd);

sprintf(recv_buf,"0|0|",NULL);

break;

case '3':

sprintf(buf,"select * from phone where number=\"%s\"",v[1]);

if(mysql_query(&mysql,buf)!=0){

fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_close(&mysql); exit(-3);

}

if((result=mysql_store_result(&mysql))==NULL){

fprintf(stderr,"Error in store_result: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_free_result(result);mysql_close(&mysql); exit(-4);

}

if((hang=mysql_num_rows(result))==0){

sprintf(fd_buf,"%-10s%-30s[FAILD] NOT EXIST\n",v[1],v[2]);

write(fd,fd_buf,strlen(fd_buf)+1);

close(fd);

sprintf(recv_buf,"8|%s|%s|0|",v[1],v[2]);

break;

}

row=mysql_fetch_row(result);

money=atof(row[2])+atof(v[2]); sprintf(up_buf,"update phone set money=%f where number=\"%s\"",money,row[0]);

if(mysql_query(&mysql,up_buf)!=0){

fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_close(&mysql); exit(-3);

}

sprintf(fd_buf,"%-10s%-30s[OK]\n",v[1],v[2]);

write(fd,fd_buf,strlen(fd_buf)+1);

close(fd);

sprintf(recv_buf,"0|0|",NULL);

break;

case '4':

sprintf(buf,"select * from phone where number=\"%s\"",v[1]);

if(mysql_query(&mysql,buf)!=0){

fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_close(&mysql); exit(-3);

}

if((result=mysql_store_result(&mysql))==NULL){

fprintf(stderr,"Error in store_result: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));

mysql_free_result(result);mysql_close(&mysql); exit(-4);

}

if((hang=mysql_num_rows(result))==0){

sprintf(fd_buf,"%-40s[FAILD] USER NOT EXIST\n",v[1]);

write(fd,fd_buf,strlen(fd_buf)+1);

close(fd);

sprintf(recv_buf,"6|%s|%s|0|",v[1],v[2]);

break;

}

row=mysql_fetch_row(result); sprintf(recv_buf,"1|%s|%s|%s|0",row[0],row[1],row[2]);

sprintf(fd_buf,"%-42s[0K] SELECT\n",v[1]);

write(fd,fd_buf,strlen(fd_buf)+1);

close(fd);

break;

default:;

}

write(com_fd,recv_buf,strlen(recv_buf)+1);

close(com_fd);

return 0;

}

if(pid>0){

close(com_fd);

continue;

}

}

}

九、 总结,收获与体会。

不知不觉间历时两个星期的课程设计已经结束了,在本次设计中我主要负责编写中间件,一个我从没有深入接触过的东西。还记得刚拿到题时的迷茫和完全不知所措,不过经历了这么多次课程设计,我早已经深刻的明白这种迷茫并不意味着一种困境,而是一种动力。随着设计前几天认真的听指导老师讲课,然后不断在网上搜索有关知识,我对中间件的功能和用法的理解越来越全面。虽然此次只是一次课程设计,但我必须要做到别出心裁,以便使中间件在整个系统中不显得多余,充分发挥功能。所以我们决定用两个服务器,这也就大大提高对中间件编程的逻辑要求。

我必须使中间件在整个系统中能识别客户端发来的信息来自动将信息转发给那个服务器,还能识别服务器返回的信息,以便在服务器之间进行信息转发。从而达到的结果是:用户可以通过特殊字符来决定是选择现金缴费还是网络银行缴费,此字符的识别时由中间件来完成的,当正常进行时,银行把钱扣掉后把信息返回给中间件,中间件再转发给另一个服务器移动公司,以此来给手机充值。当移动公司运行故障没能给手机交上费,它就会给中间件返回一条信息,中间件通过识别,在再将信息转发给银行,银行收到信息后把已经扣掉的钱再加上。这就是中间件在整个系统运作中所充当的角色,发挥的作用。

总之,在本次设计中,我发现了自己的许多不足和知识的欠缺,同时我也真正学到了不少实用的知识。 在这个过程中,我也曾经因为实践经验的缺乏失落过,也曾经仿真成功而热情高涨。生活就是这样,汗水预示着结果也见证着收获。通过这次课程设计,我想说:为完成这次课程设计我们确实很辛苦,但苦中仍有乐,和团队人员这十几天的一起工作的日子,让我们有说有笑,相互帮助,配合默契,这个工程确实很累,但当我们仿真实验成功的时候,当我们的程序成功实现所要求的功能的时候,我们的心中就不免兴奋,不免激动。以前种种艰辛这时就变成了最甜美的回忆!对我而言,知识上的收获重要,精神上的丰收更加可喜。让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个非常美好的回忆!

十、参考文献

(1) Linux 操作系统

(2) Linux+php+mysql网络编程

(3) Linux/Unix C编程入门

(4) 红帽Linux9 从入门到精通……电子工业出版社出版

5771001803090012095 579036822859633082

5771001803090012386 576137399735760696

5771001803090013594 578077579902515512

5771001803090012387 577164982601818051

5771001803090012138 572131192158918326

5771001803090012359 579036822361076053

5771001803090012356 576135286143791742

5771001803090012355 575087869704693279

17088100343355274 101229944325833379

17088100343355275 101866732938832008

17088100343356107 101581152501500522

17088100343356108 101000180059871732

17088100343354295 101074194142687017

17088100343356184 101878660869628802

17088100343356185 101775831174086674

17088100343356109 101086014373572846

17088100343356110 101152207216014916

17088100343355237 101027041605702709

17088100343355238 101229364861425414

17088100343356169 101862204402635718

17088100343354928 101760654089788804

本文来源:https://www.2haoxitong.net/k/doc/03ec6dab9a89680203d8ce2f0066f5335a816790.html

《中国移动手机缴费管理系统.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式