- common.h头文件
声明了一系列的头文件包括一下结构体
extern int buf[date]:声明一个全局变量buf,大小为date
- struct DATA:定义了一个名为DATA的结构体类型,包含账号id、姓名name、密码passwd、余额money、收款方账号o_id和客户端的pid号
- struct C2SMSG:定义了一个名为C2SMSG的结构体类型,包含一个长整型type和一个DATA类型的data成员
- struct S2SMSG:定义了一个名为S2SMSG的结构体类型,包含一个长整型type、一个账号id、一个余额money和一个信息字符串info
- 服务器搭建
包含了common.h头文件,该文件应包含必要的定义和声明。
声明了两个全局变量c2smsgid和s2cmsgid,用于存储客户端到服务器和服务器到客户端消息队列的ID。
定义了一个结构体INFOR,它包含关于每个要执行的命令的信息。包括可执行文件的路径、文件名和子进程的PID。
使用infor数组初始化一个包含每个命令信息的数组。
定义了stop函数来处理服务器的终止。在退出之前,它向每个子进程发送一个kill信号,并删除消息队列。
主函数开始时打印一条消息,说明如何退出服务器。
使用signal函数将stop函数注册为信号2(SIGINT)的信号处理程序,当用户按下Ctrl+C时会发送该信号。
使用msgget函数创建消息队列,使用S2CKEY和C2SKEY作为键值。如果创建失败,则打印错误并返回。
使用循环为infor数组中的每个命令fork一个子进程。在每个子进程中,使用execl函数用指定的可执行文件替换当前进程映像。
父进程进入一个无限循环(while(1)),以保持服务器运行。
3. 客户端
用户可以选择不同的操作,包括开户、销户、查询、取款、存款和转账。
- 开户功能会要求用户输入姓名、密码和金额,然后向服务器发送开户请求,并接收服务器返回的账号信息。
- 查询功能会要求用户输入账号和密码,然后向服务器发送查询请求,并接收服务器返回的账户信息并显示在屏幕上。
- 取款功能会要求用户输入账号和密码,然后向服务器发送取款请求,并接收服务器返回的账户余额信息并显示在屏幕上。
- 存款功能会要求用户输入账号和密码,然后向服务器发送存款请求,并接收服务器返回的账户余额信息并显示在屏幕上。
- 转账功能会要求用户输入转账的账号、密码和金额,然后向服务器发送转账请求,并接收服务器返回的账户余额信息并显示在屏幕上。
这段代码使用了消息队列进行进程间通信,通过发送和接收消息来实现与服务器的交互。
这段程序涉及到以下知识点:
- C语言基础:包括变量定义、函数定义、条件语句、循环语句、输入输出等基本语法和操作
- 消息队列(Message Queue):使用
msgget函数创建消息队列,使用msgsnd函数向消息队列发送消息,使用msgrcv函数从消息队列接收消息。消息队列是一种进程间通信的方式,用于在不同进程之间传递数据。
- 结构体(Struct):使用结构体定义消息的数据结构,包括客户端向服务器发送的请求数据和服务器向客户端返回的响应数据。
- 文件操作:使用
open函数打开文件,使用read函数读取文件内容。
- 字符串处理:使用
strcmp函数比较字符串是否相等,使用sprintf函数格式化字符串。
- 进程间通信(IPC):通过消息队列实现进程间的通信,客户端和服务器之间可以发送和接收消息进行数据交换。
- 用户界面:使用
printf和scanf函数实现简单的命令行用户界面,提示用户输入选项和参数,并显示相应的结果。
4.服务器开户功能
通过消息队列接收客户端发送的开户请求,包括客户的姓名、密码和金额等信息。
- 生成一个唯一的银行卡号,并将其作为开户结果返回给客户端。
- 将客户的开户信息保存到文件中,文件名为银行卡号。
具体解释如下:
- main()
函数中,通过消息队列接收客户端发送的开户请求。然后打印客户端发送的开户信息,包括姓名、密码、金额和进程ID。
- 调用
Account()函数生成一个唯一的银行卡号,并将其作为开户结果返回给客户端。如果生成银行卡号失败,返回-1。
- 如果生成银行卡号成功,将开户结果和银行卡号保存到
w_buf结构体中,并调用Save()函数将客户的开户信息保存到文件中。
- 最后,通过消息队列将开户结果发送给客户端。
- Account()
函数用于生成唯一的银行卡号。它打开一个名为"account.txt"的文件,读取当前的银行卡号,递增后写回文件,并返回递增后的银行卡号。
- Save()
函数用于将客户的开户信息保存到文件中。它根据银行卡号生成文件名,然后打开文件并将客户的开户信息写入文件。
5. 服务器存款功能
主要的功能如下:
- 通过消息队列接收客户端发送的存款请求,包括客户的姓名、密码、金额和银行卡号等信息。
- 将客户的存款信息保存到文件中,文件名为银行卡号。
- 将客户的存款结果返回给客户端。
具体解释如下:
- main()
函数中,通过消息队列接收客户端发送的存款请求。然后打印客户端发送的存款信息,包括姓名、密码、金额、银行卡号和进程ID。
- 将客户的存款信息保存到文件中。根据银行卡号生成文件名,然后打开文件并将客户的存款信息写入文件。
- 最后,通过消息队列将存款结果返回给客户端。
- Save()
函数用于将客户的存款信息保存到文件中。它根据银行卡号生成文件名,然后打开文件并将客户的存款信息写入文件。
6. 服务器端查询功能
主要的功能如下:
- 通过消息队列接收客户端发送的查询请求,包括客户的姓名、密码、金额和进程ID等信息。
- 将客户的查询结果返回给客户端。
具体解释如下:
- main()
函数中,通过消息队列接收客户端发送的查询请求。然后打印客户端发送的查询信息,包括姓名、密码、金额和进程ID。
- 将客户的查询结果返回给客户端。将客户端发送的金额作为查询结果返回给客户端。
- 最后,通过消息队列将查询结果返回给客户端。
7.服务器端取款功能
主要的功能如下:
- 通过消息队列接收客户端发送的取款请求,包括客户的姓名、密码、金额、账号ID和进程ID等信息。
- 根据账号ID查找对应的文件,并将取款请求信息写入该文件。
- 将取款结果返回给客户端。
具体解释如下:
- main()
函数中,通过消息队列接收客户端发送的取款请求。然后打印客户端发送的取款信息,包括姓名、密码、金额、账号ID和进程ID。
- 根据账号ID构建文件名,并尝试打开该文件。如果文件打开失败,表示该账号不存在,返回错误信息给客户端。
- 如果文件打开成功,表示该账号存在,将取款请求信息写入该文件。
- 最后,通过消息队列将取款结果返回给客户端。
- Save()
函数用于将取款请求信息写入文件。根据取款请求的账号ID构建文件名,并打开该文件。然后将取款请求信息写入文件,并关闭文件。
8. 服务器端转账功能
主要的功能如下:
- 通过消息队列接收客户端发送的转账请求,包括转出账户的姓名、密码、金额、账号ID和进程ID等信息。
- 根据转出账户的账号ID查找对应的文件,并将转账请求信息写入该文件。
- 将转账结果返回给客户端。
具体解释如下:
- main()
函数中,通过消息队列接收客户端发送的转账请求。然后打印客户端发送的转账信息,包括转出账户的姓名、密码、金额、账号ID和进程ID。
- 根据转出账户的账号ID构建文件名,并尝试打开该文件。如果文件打开失败,表示该账号不存在,返回错误信息给客户端。
- 如果文件打开成功,表示该账号存在,将转账请求信息写入该文件。
- 最后,通过消息队列将转账结果返回给客户端。
- Save()
函数用于将转账请求信息写入文件。根据转账请求的账号ID构建文件名,并打开该文件。然后将转账请求信息写入文件,并关闭文件。
9.服务器端销户功能
主要的功能如下:
- 通过消息队列接收客户端发送的销户请求,包括客户的姓名、密码、金额、账号ID和进程ID等信息。
- 根据账号ID查找对应的文件,并删除该文件来模拟销户操作。
- 将销户结果返回给客户端。
具体解释如下:
- main()
函数中,通过消息队列接收客户端发送的销户请求。然后打印客户端发送的销户信息,包括姓名、密码、金额、账号ID和进程ID。
- 根据账号ID构建文件名,并尝试打开该文件。如果文件打开失败,表示该账号不存在,返回错误信息给客户端。
- 如果文件打开成功,表示该账号存在,使用
unlink()函数删除该文件,模拟销户操作。
- 最后,通过消息队列将销户结果返回给客户端
//所有.c要用到的头文件
- common.h头文件
#ifndef _COMMON_H_
#define _COMMON_H_
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
//传递信息要用到的结构类型
#define C2SKEY 0X12345//客户端向服务器发送
#define S2CKEY 0X54321//服务器向客户端发送
#define date 2000
enum{OPEN=666,DEL,SAVE,DEPO,QUERY,Renittance,WITH};
extern int buf[date];
struct DATA{
int id;//账号
char name[20];//姓名
char passwd[20];//密码
float money;//余额
int o_id;//收款方账号(只有转账用)
pid_t pid;//客户端的pid号
};
struct C2SMSG{
long type;//客户端向服务器发送消息的类型
struct DATA data;//消息内容
};
struct S2SMSG{
long type;//服务器回复客户端的消息类型
int id;//账号(开户使用)
float money;//余额(和钱有关的操作都要使用)
char info[32];//提示信息
};
#endif
serve.c //服务器端
#include "common.h"
int c2smsgid,s2cmsgid;
struct INFOR{
char path[200];//可执行文件的路径
char xname[20];//可执行文件的文件名
pid_t pid;//子进程pid
};
struct INFOR infor[]={ {"/home/long/桌面/linux_常用命令/银行终端管理系统/open", "open"},
{"/home/long/桌面/linux_常用命令/银行终端管理系统/Deposit", "Deposit"},
{"/home/long/桌面/linux_常用命令/银行终端管理系统/Query", "Query"},
{"/home/long/桌面/linux_常用命令/银行终端管理系统/WithDraw", "WithDraw"},
{"/home/long/桌面/linux_常用命令/银行终端管理系统/remittance", "remittance"},
{"/home/long/桌面/linux_常用命令/银行终端管理系统/Dele", "Dele"}};
void stop(int a)
{
for(int i=0;i<sizeof(infor)/sizeof(infor[0]);i++)
{
kill(infor[i].pid,9);
}
msgctl(c2smsgid,IPC_RMID,NULL);
msgctl(s2cmsgid,IPC_RMID,NULL);
exit(0);
}
int main()
{
printf("按ctrl+c退出服务器\n");
signal(2,stop);
//创建消息队列
s2cmsgid=msgget(S2CKEY,IPC_CREAT|0644);
if(s2cmsgid == -1)
{
perror("msgget");
return -1;
}
c2smsgid=msgget(C2SKEY,IPC_CREAT|0644);
if(c2smsgid == -1)
{
perror("msgget");
return -1;
}
for(int i=0;i<sizeof(infor)/sizeof(infor[0]);i++)
{
infor[i].pid = fork();
if(infor[i].pid == 0)
{
execl(infor[i].path,infor[i].xname,NULL);
}
}
while(1);
}
slient.c // 客户端
#include "common.h"
int Menu(void);
void OpenAccount(void);
int WithDraw ();
int Query();
int Dele();
void Deposit();
int remittance ();
int c2smsgid,s2cmsgid;
int buf[2000]={0};
int main()
{
printf("客户端已启动\n");
//访问消息队列
s2cmsgid=msgget(S2CKEY,IPC_CREAT|0644);
if(s2cmsgid == -1)
{
perror("msgget");
return -1;
}
c2smsgid=msgget(C2SKEY,IPC_CREAT|0644);
if(c2smsgid == -1)
{
perror("msgget");
return -1;
}
while(1)
{
switch (Menu())
{
case 1:
OpenAccount();
break;
case 2:
Dele();
break;
case 3:
Query();
break;
case 4:
WithDraw ();
break;
case 5:
Deposit();
break;
case 6:
remittance ();
break;
case 7:
return 0;
break;
default:
printf("输入错误请重新输入\n");
break;
}
}
}
int Menu(void)
{
int num = 0;
printf("1.开户\n");
printf("2.销户\n");
printf("3.查询\n");
printf("4.取款\n");
printf("5.存款\n");
printf("6.转账\n");
printf("7.退出\n");
printf("请选择功能\n");
scanf("%d",&num);
getchar();
system("clear");
return num;
}
void OpenAccount(void)
{
struct C2SMSG w_buf;
struct S2SMSG r_buf;
printf("请输入姓名\n");
scanf("%s",w_buf.data.name);
getchar();
system("clear");
printf("请输入密码\n");
scanf("%s",w_buf.data.passwd);
getchar();
system("clear");
printf("请输入金额\n");
scanf("%f",&w_buf.data.money);
system("clear");
w_buf.type = OPEN;
w_buf.data.pid = getpid();
msgsnd(c2smsgid,&w_buf,sizeof(struct C2SMSG)-sizeof(long),0);
getchar();
msgrcv(s2cmsgid,&r_buf,sizeof( struct S2SMSG)-sizeof(long),getpid(),0);
if(!strcmp(r_buf.info,"开户成功"))
{
printf("开户成功\n");
printf("账号:%d\n",r_buf.id);
}
}
int Query()
{
struct C2SMSG r_buf;
struct S2SMSG w_buf;
char arr[20];
char mypasswd[20];
int id ;
printf("请输入需要查询的账号\n");
scanf("%d",&id);
getchar();
system("clear");
sprintf(arr,"%d.txt",id);
int fd =open(arr,O_RDWR,0644);
if(fd==-1)
{
printf("该账号不存在\n");
}
else
{
printf("该账号存在\n");
read(fd,&r_buf,sizeof(r_buf));
for(int i=3;i>0;i--)
{
printf("请输入密码\n");
scanf("%s",mypasswd);
getchar();
system("clear");
if(strcmp(mypasswd,r_buf.data.passwd)!=0)
{
if((i-1)==0)
{
printf("卡号以冻结,请回柜台解冻\n");
break;
}
printf("密码错误,您还有%d次机会\n",i-1);
continue;
}
else
{
printf("密码正确\n");
r_buf.type =QUERY;
msgsnd(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),0);
printf("卡号为:%d\n",r_buf.data.id);
printf("姓名为:%s\n",r_buf.data.name);
printf("账户余额为:%.2f\n",r_buf.data.money);
break;
}
}
}
close(fd);
return 0 ;
}
void Deposit()
{
struct C2SMSG r_buf;
struct S2SMSG w_buf;
char arr[20];
char mypasswd[20];
int id ;
float mymoney;
printf("请输入需要存款的账号\n");
scanf("%d",&id);
getchar();
system("clear");
sprintf(arr,"%d.txt",id);
int fd =open(arr,O_RDWR,0644);
if(fd==-1)
{
printf("该账号不存在\n");
}
else
{
printf("该账号存在\n");
read(fd,&r_buf,sizeof(r_buf));
for(int i=3;i>0;i--)
{
printf("请输入密码\n");
scanf("%s",mypasswd);
getchar();
system("clear");
if(strcmp(mypasswd,r_buf.data.passwd)!=0)
{
if((i-1)==0)
{
printf("卡号以冻结,请回柜台解冻\n");
break;
}
printf("密码错误,您还有%d次机会\n",i-1);
continue;
}
else
{
printf("密码正确\n");
printf("账户余额为:%.2f\n",r_buf.data.money);
printf("请输入需要存款金额\n");
scanf("%f",&mymoney);
getchar();
system("clear");
r_buf.data.money=r_buf.data.money+mymoney;
// w_buf.money=r_buf.data.money;
//write(fd,&r_buf,sizeof(r_buf));
r_buf.type=DEPO;
msgsnd(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),0);
printf("账户余额为:%.2f\n",r_buf.data.money);
printf("存款成功\n");
break;
}
}
}
close(fd);
}
//取款
int WithDraw ()
{
struct C2SMSG r_buf;
struct S2SMSG w_buf;
char arr[20];
char mypasswd[20];
int id ;
char c;
float mymoney,tmp;
printf("请输入需要取款的账号\n");
scanf("%d",&id);
getchar();
system("clear");
sprintf(arr,"%d.txt",id);
int fd =open(arr,O_RDWR,0644);
if(fd==-1)
{
printf("该账号不存在\n");
}
else
{
read(fd,&r_buf,sizeof(r_buf));
for(int i=3;i>0;i--)
{
printf("请输入密码\n");
scanf("%s",mypasswd);
getchar();
system("clear");
if(strcmp(mypasswd,r_buf.data.passwd)!=0)
{
if((i-1)==0)
{
printf("卡号以冻结,请回柜台解冻\n");
break;
}
printf("密码错误\n");
continue;
}
else
{
printf("密码正确\n");
printf("账户当前余额为:%.2f\n",r_buf.data.money);
for(int i=0;i<3;i++)
{
printf("请输入需要取款金额\n");
scanf("%f",&mymoney);
getchar();
printf("取款金额是否确定(Y \\ N)\n");
scanf("%c",&c);
getchar();
system("clear");
if(c=='y'||c=='Y')
{
tmp = r_buf.data.money-mymoney;
if(tmp>=0)
{
r_buf.data.money=r_buf.data.money-mymoney;
break;
}
else
{
printf("账户当前余额为:%.2f\n",r_buf.data.money);
printf("余额不足,请重新输入\n");
}
}
else
{
printf("成功退出\n");
return 0 ;
}
}
// w_buf.money=r_buf.data.money;
r_buf.type=WITH;
msgsnd(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),0);
printf("账户余额为:%.2f\n",r_buf.data.money);
printf("取款款成功\n");
break;
}
}
}
return 0 ;
}
//转账
int remittance ()
{
struct C2SMSG r_buf;
struct C2SMSG r_buf1;
struct S2SMSG w_buf;
char arr[20],arr1[20];
char mypasswd[20];
int id,id2;
float mymoney;
printf("请输入转账的账号\n");
scanf("%d",&id);
getchar();
system("clear");
sprintf(arr,"%d.txt",id);
int fd =open(arr,O_RDWR,0644);
if(fd==-1)
{
printf("该账号不存在\n");
}
else
{
printf("该账号存在\n");
read(fd,&r_buf,sizeof(r_buf));
for(int i=3;i>0;i--)
{
printf("请输入密码\n");
scanf("%s",mypasswd);
getchar();
system("clear");
if(strcmp(mypasswd,r_buf.data.passwd)!=0)
{
if((i-1)==0)
{
printf("卡号以冻结,请回柜台解冻\n");
break;
}
printf("密码错误\n");
continue;
}
else
{
printf("密码正确\n");
printf("账户余额为:%.2f\n",r_buf.data.money);
for(int i=0;i<3;i++)
{
printf("请输入需要转向的账号\n");
scanf("%d",&id2);
getchar();
system("clear");
sprintf(arr1,"%d.txt",id2);
int ft =open(arr1,O_RDWR,0644);
if(ft==-1)
{
printf("该账号不存在,重新输入\n");
continue;
}
else
{
for(int i=0;i<3;i++)
{
printf("请输入需要转账金额\n");
scanf("%f",&mymoney);
getchar();
system("clear");
read(ft,&r_buf1,sizeof(r_buf1));
r_buf.data.money=r_buf.data.money-mymoney;
r_buf1.data.money=r_buf1.data.money+mymoney;
w_buf.money=r_buf.data.money;
write(fd,&r_buf,sizeof(r_buf));
if(r_buf.data.money<0)
{
printf("余额不足,重新输入\n");
}
else
{
printf("转账账户余额为:%.2f\n",r_buf.data.money);
printf("账户余额为:%.2f\n",r_buf1.data.money);
printf("存款成功\n");
close(fd);
r_buf1.type=Renittance;
r_buf.type=Renittance;
msgsnd(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),0);
msgsnd(c2smsgid,&r_buf1,sizeof(struct C2SMSG)-sizeof(long),0);
return 0 ;
}
}
}
}
}
}
}
}
int Dele()
{
struct C2SMSG r_buf;
struct S2SMSG w_buf;
char arr[20];
char mypasswd[20];
int id ;
printf("请输入需要消除的账号\n");
scanf("%d",&id);
getchar();
system("clear");
sprintf(arr,"%d.txt",id);
int fd =open(arr,O_RDWR,0644);
if(fd==-1)
{
printf("该账号不存在\n");
}
else
{
printf("该账号存在\n");
read(fd,&r_buf,sizeof(r_buf));
for(int i=3;i>0;i--)
{
printf("请输入密码\n");
scanf("%s",mypasswd);
getchar();
system("clear");
if(strcmp(mypasswd,r_buf.data.passwd)!=0)
{
if((i-1)==0)
{
printf("卡号以冻结,请回柜台解冻\n");
break;
}
printf("密码错误,您还有%d次机会\n",i-1);
continue;
}
else
{
printf("密码正确\n");
r_buf.type = DEL;
msgsnd(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),0);
printf("账户余额为:%.2f\n",r_buf.data.money);
if(r_buf.data.money!=0)
{
printf("取出账户%.2f元\n",r_buf.data.money);
r_buf.data.money = 0;
msgsnd(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),0);
return 0 ;
}
else{
printf("销户成功\n");
msgsnd(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),0);
return 0 ;
}
break;
}
}
}
close(fd);
return 0 ;
}
Dele.c //注销
#include "common.h"
int c2smsgid, s2cmsgid;
void Save(struct C2SMSG r_buf);
int main()
{
printf("服务器销户功能启动成功\n");
struct C2SMSG r_buf;
struct S2SMSG w_buf;
char arr[20];
//访问消息队列
s2cmsgid=msgget(S2CKEY,IPC_CREAT|0644);
if(s2cmsgid == -1)
{
perror("msgget");
return -1;
}
c2smsgid=msgget(C2SKEY,IPC_CREAT|0644);
if(c2smsgid == -1)
{
perror("msgget");
return -1;
}
while (1)
{
msgrcv(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),DEL,0);
printf("姓名:%s\n",r_buf.data.name);
printf("密码:%s\n",r_buf.data.passwd);
printf("金额:%.2f\n",r_buf.data.money);
printf("id:%d\n",r_buf.data.id);
printf("pid:%d\n",r_buf.data.pid);
w_buf.type = r_buf.data.pid;
w_buf.money=r_buf.data.money;
sprintf(arr,"%d.txt",r_buf.data.id);
int fd =open(arr,O_RDWR,0644);
if(fd==-1)
{
printf("该账号不存在\n");
return -1;
}
else
{
printf("该账号存在\n");
unlink(arr);
msgsnd(s2cmsgid,&r_buf,sizeof( struct S2SMSG)-sizeof(long),0);
printf("销户成功\n");
}
}
return 0 ;
}
open.c // 开户
#include "common.h"
int c2smsgid,s2cmsgid;
int Account(void);
void Save(struct C2SMSG r_buf);
int count=0,buf[2000]={0};
int main()
{
printf("服务器开户功能启动成功\n");
//访问消息队列
s2cmsgid=msgget(S2CKEY,IPC_CREAT|0644); if(s2cmsgid == -1) {
perror("msgget");
return -1;
}
c2smsgid=msgget(C2SKEY,IPC_CREAT|0644);
if(c2smsgid == -1)
{
perror("msgget");
return -1;
}
struct C2SMSG r_buf;//接受客户端开户信息
struct S2SMSG w_buf;//给客户端返回操作结果
while(1)
{
msgrcv(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),OPEN,0);
printf("姓名:%s\n",r_buf.data.name);
printf("密码:%s\n",r_buf.data.passwd);
printf("金额:%.2f\n",r_buf.data.money);
printf("pid:%d\n",r_buf.data.pid);
w_buf.type = r_buf.data.pid;
w_buf.id = Account();
w_buf.money=r_buf.data.money;
r_buf.data.id = w_buf.id;
if(w_buf.id == -1)
{
strcpy(w_buf.info,"开户失败");
}
else
{
strcpy(w_buf.info,"开户成功");
Save(r_buf);
}
msgsnd(s2cmsgid,&w_buf,sizeof( struct S2SMSG)-sizeof(long),0);
printf("开户成功\n");
}
return 0;
}
int Account(void)//保证银行卡号不重复
{
int id = 20230816;
int fd =open("account.txt",O_RDWR|O_CREAT,0644);
if(fd == -1)
{
perror("open");
return -1;
}
read(fd,&id,sizeof(int));
printf("id1 = %d\n",id);
id++;
lseek(fd,0,0);
write(fd,&id,sizeof(int));
close(fd);
return id;
}
void Save(struct C2SMSG r_buf)
{
char filename[100];
sprintf(filename,"%d.txt",r_buf.data.id);
int fd = open(filename,O_WRONLY|O_CREAT,0644);
write(fd,&r_buf,sizeof(r_buf));
close(fd);
}
WithDraw.c // 取款
#include "common.h"
int c2smsgid, s2cmsgid;
void Save(struct C2SMSG r_buf);
int main()
{
struct C2SMSG r_buf;
struct S2SMSG w_buf;
char arr[20];
printf("服务器取款功能启动成功\n");
//访问消息队列
s2cmsgid=msgget(S2CKEY,IPC_CREAT|0644);
if(s2cmsgid == -1)
{
perror("msgget");
return -1;
}
c2smsgid=msgget(C2SKEY,IPC_CREAT|0644);
if(c2smsgid == -1)
{
perror("msgget");
return -1;
}
while (1)
{
msgrcv(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),WITH,0);
printf("姓名:%s\n",r_buf.data.name);
printf("密码:%s\n",r_buf.data.passwd);
printf("金额:%.2f\n",r_buf.data.money);
printf("id:%d\n",r_buf.data.id);
printf("pid:%d\n",r_buf.data.pid);
w_buf.type = r_buf.data.pid;
w_buf.money=r_buf.data.money;
sprintf(arr,"%d.txt",r_buf.data.id);
int fd =open(arr,O_RDWR,0644);
if(fd==-1)
{
printf("该账号不存在\n");
return -1;
}
else
{
Save(r_buf);
msgsnd(s2cmsgid,&r_buf,sizeof( struct S2SMSG)-sizeof(long),0);
printf("账户余额:%.2f\n",r_buf.data.money);
printf("取款成功\n");
}
}
return 0 ;
}
void Save(struct C2SMSG r_buf)
{
char filename[100];
sprintf(filename,"%d.txt",r_buf.data.id);
int fd = open(filename,O_WRONLY|O_CREAT,0644);
write(fd,&r_buf,sizeof(r_buf));
close(fd);
}
remittance.c //转账
#include "common.h"
int c2smsgid, s2cmsgid;
void Save(struct C2SMSG r_buf,struct C2SMSG r_buf1);
int main()
{
struct C2SMSG r_buf;
struct C2SMSG r_buf1;
struct S2SMSG w_buf;
char arr[20];
printf("服务器转账功能启动成功\n");
//访问消息队列
s2cmsgid=msgget(S2CKEY,IPC_CREAT|0644);
if(s2cmsgid == -1)
{
perror("msgget");
return -1;
}
c2smsgid=msgget(C2SKEY,IPC_CREAT|0644);
if(c2smsgid == -1)
{
perror("msgget");
return -1;
}
while (1)
{
msgrcv(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),Renittance,0);
msgrcv(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),Renittance,0);
printf("姓名:%s\n",r_buf.data.name);
printf("密码:%s\n",r_buf.data.passwd);
printf("金额:%.2f\n",r_buf.data.money);
printf("id:%d\n",r_buf.data.id);
printf("pid:%d\n",r_buf.data.pid);
w_buf.type = r_buf.data.pid;
w_buf.money=r_buf.data.money;
sprintf(arr,"%d.txt",r_buf.data.id);
int fd =open(arr,O_RDWR,0644);
if(fd==-1)
{
printf("该账号不存在\n");
return -1;
}
else
{
Save(r_buf,r_buf1);
msgsnd(s2cmsgid,&r_buf,sizeof( struct S2SMSG)-sizeof(long),0);
msgsnd(s2cmsgid,&r_buf1,sizeof( struct S2SMSG)-sizeof(long),0);
printf("账户余额:%.2f\n",r_buf.data.money);
printf("转账成功\n");
}
}
return 0 ;
}
void Save(struct C2SMSG r_buf,struct C2SMSG r_buf1)
{
char filename[100];
sprintf(filename,"%d.txt",r_buf.data.id);
int fd = open(filename,O_WRONLY|O_CREAT,0644);
write(fd,&r_buf,sizeof(r_buf));
close(fd);
char filename1[100];
sprintf(filename,"%d.txt",r_buf1.data.id);
int ft = open(filename1,O_WRONLY|O_CREAT,0644);
write(ft,&r_buf1,sizeof(r_buf1));
close(ft);
}
Deposit.c //存款
#include "common.h"
int c2smsgid, s2cmsgid;
void Save(struct C2SMSG r_buf);
int main()
{
struct C2SMSG r_buf;
struct S2SMSG w_buf;
char arr[20];
printf("服务器存款功能启动成功\n");
//访问消息队列
s2cmsgid=msgget(S2CKEY,IPC_CREAT|0644);
if(s2cmsgid == -1)
{
perror("msgget");
return -1;
}
c2smsgid=msgget(C2SKEY,IPC_CREAT|0644);
if(c2smsgid == -1)
{
perror("msgget");
return -1;
}
while (1)
{
msgrcv(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),DEPO,0);
printf("姓名:%s\n",r_buf.data.name);
printf("密码:%s\n",r_buf.data.passwd);
printf("id:%d\n",r_buf.data.id);
w_buf.type = r_buf.data.pid;
w_buf.money=r_buf.data.money;
sprintf(arr,"%d.txt",r_buf.data.id);
Save(r_buf);
msgsnd(s2cmsgid,&r_buf,sizeof( struct S2SMSG)-sizeof(long),0);
printf("账户余额:%.2f\n",r_buf.data.money);
printf("存款成功\n");
}
return 0 ;
}
void Save(struct C2SMSG r_buf)
{
char filename[100];
sprintf(filename,"%d.txt",r_buf.data.id);
int fd = open(filename,O_WRONLY|O_CREAT,0644);
write(fd,&r_buf,sizeof(r_buf));
close(fd);
}
Query.c //查询
#include "common.h"
int c2smsgid,s2cmsgid;
int Account(void);
void Save(struct C2SMSG r_buf);
int count=0,buf[2000]={0};
int main()
{
float mymoney;
printf("服务器查询功能启动成功\n");
//访问消息队列
s2cmsgid=msgget(S2CKEY,IPC_CREAT|0644);
if(s2cmsgid == -1)
{
perror("msgget");
return -1;
}
c2smsgid=msgget(C2SKEY,IPC_CREAT|0644);
if(c2smsgid == -1)
{
perror("msgget");
return -1;
}
struct C2SMSG r_buf;//接受客户端开户信息
struct S2SMSG w_buf;//给客户端返回操作结果
while(1)
{
msgrcv(c2smsgid,&r_buf,sizeof(struct C2SMSG)-sizeof(long),QUERY,0);
printf("姓名:%s\n",r_buf.data.name);
printf("密码:%s\n",r_buf.data.passwd);
printf("余额:%.2f\n",r_buf.data.money);
printf("pid:%d\n",r_buf.data.pid);
w_buf.type = r_buf.data.pid;
w_buf.money=r_buf.data.money;
msgsnd(s2cmsgid,&w_buf,sizeof( struct S2SMSG)-sizeof(long),0);
printf("查询成功\n");
}
return 0;
}