软件实习电费代缴系统
河南城建学院
《软件实习2》任务书
目 电费代缴系统
计算机科学与工程系
2010-9-10
目录
《软件实习2》任务书 ................................................................................................................ - 0 - 一: 前言 .................................................................................................................................... - 2 - 二: 系统环境 ............................................................................................................................. - 2 - 三: 设计目的 ............................................................................................................................. - 2 - 四: 总体设计 ............................................................................................................................. - 3 -
- 1.客户端页面 ............................................................................................................................. - 32.客户端,中间件和服务器联系 ................................................................................................. - 3 - 五: 详细设计 ............................................................................................................................. - 4 - (1)基本功能 .......................................................................................................................... - 4 -
1.1查询费用 ......................................................................................................................... - 4 - (2) 服务器的开发 ................................................................................................................. - 4 -
2.1服务端的开发 ................................................................................................................. - 4 -
2.2 客户端的开发 ................................................................................................................ - 5 -
2.3套接字 ............................................................................................................................ - 5 - 六: 调试与测试 ......................................................................................................................... - 6 - 一(生成数据库(SOURCE *.SH) ............................................................................................. - 6 - 二(程序的编译和运行............................................................................................................. - 6 - 三(多任务模式与启动相关服务 ............................................................................................. - 6 - 四(相关操作 ............................................................................................................................ - 7 - 五(返回结果信息 .................................................................................................................... - 8 - 七: 设计中遇到的问题及解决
: ....................................................................................... - 9 - 八: 源程序清单 ......................................................................................................................... - 9 - 8(1数据库文件 ....................................................................................................................... - 9 - 8.2客户端程序 ........................................................................................................................ - 10 - 8.3中间件程序 ........................................................................................................................ - 16 - 8.4服务器 ............................................................................................................................... - 22 - 8.5服务器 ............................................................................................................................... - 27 - 九: 心得体会 ............................................................................................................................- 32 - 十:参考文献 ..............................................................................................................................- 33 -
- - 1 –-
电费代缴系统
一: 前言
近年来,随着高科技技术的告诉发展,传统的手工操作系统为主的电费缴纳的管理方式,因其信息反应慢,工作效率低,管理质量差,备受广大服务者争议。在计算机信息技术飞速发展与广泛应用的今天,这种落后的管理方式与时代的步伐已显得格格不入,对电费缴纳系统实现智能化,信息管理化,是信息时代对现代社会电费管理工作提出的严峻要求。为了更好的提供电费代缴服务,为了使电费管理更加科学,更严谨,同时更具有操作性,节省操作人员的劳动,电费缴纳系统必须与先进技术相结合,应用先进的网络管理技术来操作电费管理系统,从而使其为人们提供更方便,更快捷的电费管理服务。
二: 系统环境
在Linux环境下,使用GNU C或GNU C++,在UNIX/Linux make开发工具的的管理和控制下,利用UNIX/Linux Socket库在网络的底层进行开发设计。
缴费系统是基于UNIX Socket和MySQL数据库设计一个交易型中间件系电费
统。在Linux环境下使用GNU C或者GNU C++,在Linux make开发工具的管理和控制下,利用Linux系统提供的Socket库和MySQL数据库在网络底层开发交易型中间件,同时简要介绍了客户端和服务器的工作模式。此模拟电费交费系统采用“客户端—中间件—服务器”模式,其中主要包括三大部分: 客户端(Client),中间件(Middleware)和服务器端(Server)。客户端(Client)主要实现用户管理、查询、交易(交费,购物等),撤销和统计等功能;中间件(Middleware)要完成与客户要求相符的功能——是本地的本地处理,否则发往服务器端——接受客户端数据,组织服务器端所需数据,重组服务端返回数据,并返回给客户方;服务器端(Server)主要实现客户端或中间件提出的业务请求并做好留迹工作 三: 设计目的
对电费查询与缴费业务进行了系统全面的
研究。针对现有系统中实时性不足而造成用户欠费太多使公司企业蒙受损失的问题。采用开发工具Linux+Mysql进行系统设计。设计系统能够提供对点费信息输入、查询、编辑、打印以及话费统计各明细项目的数据编辑,自动计算出电费的各项合计数据;可自主设定条件
从而达到数据的多角度查询功能;方便导入、导出数据及输出报表。
- - 2 –-
四: 总体设计
1.客户端页面
登陆账户和密码
电在查退
费线询出
缴缴信系
纳 费 息 统
2.客户端,中间件和服务器联系
客户端
请求连接 相应请求
服务器meter 中间件
请求连接 响应请求
服务器bank(在线缴费)
- - 3 –-
五: 详细设计
(1)基本功能
1.1查询费用
客户到柜台缴纳费用,客户首先用账号及密码登陆系统,然后登陆电表序列号和银行账号,中间件根据用户提供的电表序列号码把“查询费用”指令存入数据库。中间件检测到查询费用指令,把查询费用指令组成数据包发送到服务器中。服务器把查询费用的结果返回中间件,确认信息后,从接收表中检测返回结果中间件,并监控因错误操作并返回结果。 服务器从接收表中查询到“查询费用”指令,把查询费用指令填入数据库(得到查询费用指令后从主数据库查询用户的费用信息。服务器如果因错误没有得到查询结果,把返回结果系统错误,并显示出来。
1.2缴纳费用
客户端发出“缴纳费用”指令存入中间件。中间件检测到“缴纳费用”指令,把“缴纳费用”指令组成数据包放入缓冲区,然后发送给服务器。 服务器把“缴纳费用”的指令填入接收,并返回确认信息。中间件在得到确认信息后,从接收表中检测返回结果给客户端,并监控错误无返回结果的情况。 服务器从接收表中查询到“缴纳费用”指令,把“缴纳费用”指令填入数据库。得到“缴纳费用” 后从主数据库进行处理,并把银行数据库中所缴的费用扣除,结果填入数据库。 “服务器处理系统”如果因为错误没有得到结果,把返回结果“系统错误”填入发送错误信息给中间件,然后中间件把信息返回给用户。 1.3 查询信息
通过用户名和电表序列号进行查询,录入正确则返回用户信息,反之,退出系统。
1.4 退出系统
客户端发送退出系统请求,经中间件确认。然后客户端退出系统并关闭连接。 (2) 服务器的开发
2.1服务端的开发
服务器主要包含守候进程(daemon),也叫精灵进程,或服务器进程,是生存期长的一种进程。它们常常在系统引导装入时起动,在系统关闭时终止。因为它们没有控制终端,所以说它们是在后台运行的。它等待客户机与其联系,提出某种类
- - 4 –-
型的服务要求。服务对客户机服务可将结果或信息返回给客户机(双向),也可不
返回(单向)。
2.2 客户端的开发
打开一通信通道,并连接到服务器所在主机的特定端口。向服务器发服务请求,等待并接收应答;请求结束后关闭通信通道。
客户是交易的发起者。实现功能与服务器方同。
2.3套接字
1.流式套接字(SOCK-STREAM):
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送
(FTP)即使用流式套接字。
数据报式套接字(SOCK-DGRAM) :提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。 原始式套接字(SOCK-RAW):该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。
基本套接字系统调用
创建套接字—socket()
bind() 地址绑定—
建立连接—connect()与accept()
监听连接—listen()
数据传输—send()/write()与recv()/read()
关闭套接字—close()
2.错误处理
利用函数的返回值来判断函数执行是否正确。
使用mysql提供的错误号和错误信息:
– 错误号:
unsigned int mysql_errno(MYSQL *mysql)
– 错误信息:
char *mysql_error(MYSQL *mysql)
- - 5 –-
六: 调试与测试
一(生成数据库(source *.sh)
二(程序的编译和运行
编译:
cc –o client client.c -L/usr/lib/mysql –lmysqlclient; cc –o middle middle.c -L/usr/lib/mysql –lmysqlclient; cc –o bank bank.c -L/usr/lib/mysql –lmysqlclient; cc –o meter meter.c -L/usr/lib/mysql –lmysqlclient; 运行:
./middle middle;
./meter Meter;
./bank Bank;
./client middle myhttp;
三(多任务模式与启动相关服务
- - 6 –-
四(相关操作
现金交易:
网上交易:
查询:
- - 7 –-
五(返回结果信息
- - 8 –-
七: 设计中遇到的问题及解决方法:
(1) 对Mysql 数据库不够了解,对很多数据结构和算法也理解不够牢固,
因此我们参考了《Linux+php+Mysql基础与提高》这本书,学到一些关于Mysql
的基础知识,才使工作能顺利的进行下去。
(2) 对套接字这样的概念不是很清楚,在老师的辅导和互联网的
帮助下,了解了一些这方面的知识,才使我们的设计开展下来。
(3) 以前对服务器,客户端只是了解理论知识,这次而要自己动
手来开发服务器,这对我们来说,是一个巨大的挑战,服务器就是一个进程,确
切的说是一个守候进程,要实现它的功能,是不容易的事情,你要学会套接字,
地址转换,服务器相关的数据结构和算法才能进行开发和设计。
(4) 还是很多基础的东西没有掌握好,基本的算法也没有完全掌
握,参考了教科书的相关内容后,才开始了我们的课程设计。
(5) 在数据库的编写时,很多要用到的数据类型而我们又没有学
过的,只能借助互联网的强大功能了,由此,我们也学到了很多相关的知识。
八: 源程序清单
8(1数据库文件
BANK.SH
drop database if exists bank;
create database bank;
use bank;
create table information
( number char(19) not null,passwd char(10),name char(20),money float(10,10));
insert into information(number,passwd,name,money)values("061407344","123456","zpf",1000);
insert into information(number,passwd,name,money)values("061407342","123456","zxl",1000);
insert into information(number,passwd,name,money)values("061407340","123456","yxl",1000);
Meter.SH
drop database if exists meter;
create database meter;
use meter;
create table meter(number char(11),name char(30),money float(10,10)); insert into meter(number,name,money)values("001","zpf",50);
- - 9 –-
insert into meter(number,name,money)values("002","zxl",22); insert into meter(number,name,money)values("003","yxl",20);
MIDDLE.SH
drop database if exists middle;
create database middle;
use middle;
create table information(service int,port char(20),ip char(20));
insert into information(service,port,ip)values(1,"Meter","myhttp");
insert into information(service,port,ip)values(2,"Bank","myhttp");
USERS.SH
drop database if exists users;
create database users;
use users;
create table users(name char(20),passwd char(10)); insert into users(name,passwd)values("hello","world"); 8.2客户端程序
Client.C
#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[])
-- 10 –-
{
char name[10],passwd[10],choose;
char send_buf[1024]="";
char tmp[1024],meter[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");
if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){
fprintf(stderr,"Log file %s open error!\a\n",log);
exit(-1);
}
clear:
printf("Enter the user name:");
scanf("%s",name);
getchar();
set_disp_mode(0);
getpasswd(passwd,sizeof(passwd));
set_disp_mode(1);
system("clear");
-- 11 –-
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");
-- 12 –-
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("%c",&choose);
switch(choose){
case '1':
printf("Please input your meter number: ");
scanf("%s",meter);
printf("Please input the money you want to submit:");
scanf("%s",money);
getchar();
strcat(send_buf,"3|");strcat(send_buf,meter);strcat(send_buf,"|");
strcat(send_buf,money);strcat(send_buf,"|1|");
printf("%s \n",send_buf);
break;
case '2':
printf("Please input your meter number:");
scanf("%s",meter);
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,meter);strcat(send_buf,"|");
strcat(send_buf,"2|");
printf("%s \n",send_buf);
break;
case '3':
printf("Please Enter your meter number:");
-- 13 –-
scanf("%s",meter);
getchar();
strcat(send_buf,"4|");strcat(send_buf,meter);
strcat(send_buf,"|1|");
break;
case '4':
strcpy(send_buf,"3|");
break;
default: ;
}
write(connect_fd,send_buf,strlen(send_buf)+1);
len=read(connect_fd,send_buf,1024);
if(len>0)
printf("Message from middle: %s\n",send_buf);
close(connect_fd);
switch(send_buf[0]){
case '0':
sprintf(fd_buf,"%-10s%-20s%-20s[0k]\n",name,meter,money);
write(fd,fd_buf,strlen(fd_buf));
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");
getchar();goto clen;
break;
case '3':
sprintf(fd_buf,"%s LOG OUT SUCESSFULLY",meter);
write(fd,fd_buf,strlen(fd_buf));
printf("SUCCESSFULLY LOGOUT!\n");
break;
case '5':
sprintf(fd_buf,"%-10s%-20s%-20s[FALSE] BANK NUMBER WRONG!\n",name,meter,money);
write(fd,fd_buf,strlen(fd_buf));
printf("THE BANK NUMBER IS NOT EXIST\n");
printf("Please Check it\n");
printf("please Enter any key to continue...\n");
getchar();
-- 14 –-
strcpy(send_buf,"");goto clen;
case '8':
sprintf(fd_buf,"%-10s%-20s%-20s[FALSE] PHONE NUMBER
WRONG!\n",name,meter,money);
write(fd,fd_buf,strlen(fd_buf));
printf("THE METER 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':
sprintf(fd_buf,"%-10s%-20s%-20s[FALSE] BANK PASSWD
WRONG!\n",name,meter,money);
write(fd,fd_buf,strlen(fd_buf));
printf("The passwd wrong\n");
printf("Please Enter any key to continue...\n");
getchar();
strcpy(send_buf,"");goto clen;
case '7':
sprintf(fd_buf,"%-10s%-20s%-20s[FALSE] NOT ENOUGH!\n",name,meter,money);
write(fd,fd_buf,strlen(fd_buf));
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;
}
-- 15 –-
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;
}
8.3中间件程序
MIDDLE.C
#include
#include
#include
#include
#include
-- 16 –-
#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((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){
fprintf(stderr,"Log file %s open error!\a\n",log);
exit(-1);
}
if(mysql_init(&mysql)==NULL){
fprintf(stderr,"Error in mysql_init!\n");
exit(-1);
-- 17 –-
}
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);
-- 18 –-
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){
sprintf(fd_buf,"MESSAGE FROM CLIENT:%-40s\n",recv_buf);
write(fd,fd_buf,strlen(fd_buf)+1);
printf("Message from client(%d): %s\n",len,recv_buf);
}
if(recv_buf[len-3]=='3'){
strcpy(snd_buf,"3|");
goto zhongjr;
}
clen:
len=strlen(recv_buf);
printf("recv%s\n",recv_buf);
printf("%d!!!!!!\n",recv_buf[len-2]-48);
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");
-- 19 –-
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);
if((read(clt_fd,snd_buf,1024))>0)
printf("Message From server:%s \n",snd_buf);
close(clt_fd);
printf("wo%s\n",snd_buf);
printf("rev%s\n",recv_buf);
printf("%c?????",recv_buf[strlen(recv_buf)-2]);
switch(recv_buf[len-2])
{
case '0':
break;
case '1'://zhongjianjiefanhui
sprintf(fd_buf,"MESSAGE FROM PHONE:%-40s\n",snd_buf);
write(fd,fd_buf,strlen(fd_buf)+1);
if(snd_buf[0]=='8'){
snd_buf[0]='2';
strcpy(recv_buf,snd_buf);
printf("recv_buf %s \n",recv_buf);
strcpy(snd_buf,"8|");
flag='T';
-- 20 –-
}
break;
case '2'://congyinghanghuilai haide zaicichuli//yinghangfanghui
sprintf(fd_buf,"MESSAGE FROM BANK:%-40s\n",snd_buf);
write(fd,fd_buf,strlen(fd_buf)+1);
if(snd_buf[0]=='0'){//
printf("snd_buf%s\n",snd_buf);
strcpy(recv_buf,snd_buf);recv_buf[0]='2';printf("recv_buf%s\n",recv_buf);goto clen;
}
//else{}//tianjia |0 geikehu biaoshichucuole
if(snd_buf[0]=='6'){
goto withme;
}
break;
default :;
}
zhongjr:
if(fflag=='T'){
write(com_fd,snd_buf,strlen(snd_buf)+1);//geikefu zhixiangkehuxieyici
fflag=='F';
}
withme:
if(flag=='T') {flag='F';goto clen;} //diercigotolaizhixingdeshihou
close(com_fd);
exit(0);
}
if(pid>0){
close(com_fd);
continue;
}
}
}
void strsplit(char *s,char **v,char d) {
int i,j,l;
j=0;v[j]=s;
l=strlen(s);
-- 21 –-
for(i=0;i
#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;
int com_fd;
int ret;
pid_t pid;
static char recv_buf[1024],buf[1024],up_buf[1024],save_buf[1024],fd_buf[1024];
int len;
int hang;
char d='|',**v;
int fd;
char log[]="meter.log";
float money;
-- 22 –-
struct servent *sp;
struct sockaddr_in srv_addr;
struct sockaddr_in clt_addr;
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
if(mysql_init(&mysql)==NULL){
fprintf(stderr,"Error in mysql_init!\n");
exit(-1);
}
if(!mysql_real_connect(&mysql,"localhost","root",0,"meter",0,NULL,0)){
fprintf(stderr,"Error in connection: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));
mysql_close(&mysql); exit(-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);
}
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(-5);
}
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);
-- 23 –-
return 1;
}
ret=listen(listen_fd,1024);
if(ret==-1){
perror("cannot listen the client connect request");
close(listen_fd);
return 1;
}
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((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':
printf("I I I I \n");
sprintf(buf,"select * from meter 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));
-- 24 –-
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);
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 meter 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);
sprintf(recv_buf,"0|0|",NULL);
break;
case '3':
//printf("I I I I \n");
sprintf(buf,"select * from meter 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);
sprintf(recv_buf,"8|%s|%s|0|",v[1],v[2]);
-- 25 –-
break;
}
row=mysql_fetch_row(result);
money=atof(row[2])+atof(v[2]);
sprintf(up_buf,"update meter 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] NOT EXIST\n",v[1],v[2]);
write(fd,fd_buf,strlen(fd_buf)+1);
sprintf(recv_buf,"0|0|",NULL);
break;
case '4':
printf("IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n");
sprintf(buf,"select * from meter 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);
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,"%-40s[0K] SELECT\n",v[1]);
write(fd,fd_buf,strlen(fd_buf)+1);
break;
default:;
-- 26 –-
}
write(com_fd,recv_buf,strlen(recv_buf)+1);
close(com_fd);
return 0;
}
if(pid>0){
close(com_fd);
continue;
}
}
}
void strsplit(char *s,char **v,char d)
{
int i,j,l;
j=0;v[j]=s;
l=strlen(s);
for(i=0;i #include #include #include #include #include #include #include #include
-- 27 –-
#include
#include
#include
#include
void strsplit(char *s,char **v,char d);
int main(int argc,char *argv[])
{
int listen_fd;
int com_fd;
int ret;
pid_t pid;
static char recv_buf[1024],buf[1024],up_buf[1024],save_buf[1024],fd_buf[1024];
int len;
int hang;
char d='|',**v;
int fd;
char log[]="bank.log";
float money;
struct servent *sp;
struct sockaddr_in srv_addr;
struct sockaddr_in clt_addr;
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
if(mysql_init(&mysql)==NULL){
fprintf(stderr,"Error in mysql_init!\n");
exit(-1);
}
if(!mysql_real_connect(&mysql,"localhost","root",0,"bank",0,NULL,0)){
fprintf(stderr,"Error in connection: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));
mysql_close(&mysql); exit(-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);
-- 28 –-
}
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(-5);
}
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,1024);
if(ret==-1){
perror("cannot listen the client connect request");
close(listen_fd);
return 1;
}
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;
}
-- 29 –-
if(pid==0){
close(listen_fd);
if((len=read(com_fd,recv_buf,1024))>0)
printf("The information from mid %s \n",recv_buf);
strncpy(save_buf,recv_buf,len-2);
printf("%s \n",save_buf);
strsplit(recv_buf,v,d);
sprintf(buf,"select * from information 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);
}
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
-- 30 –-
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[ADD]\n",v[1],v[3]);
write(fd,fd_buf,strlen(fd_buf)+1);
}
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[DROP]\n",v[1],v[2]);
write(fd,fd_buf,strlen(fd_buf)+1);
break;
default:;
}
write(com_fd,save_buf,len);
close(fd);
close(com_fd);
return 0;
}
if(pid>0){
-- 31 –-
close(com_fd);
continue;
}
}
}
void strsplit(char *s,char **v,char d) {
int i,j,l;
j=0;v[j]=s;
l=strlen(s);
for(i=0;i