主要分为两人大模块:
客户端
1、进入时的功能开户、销户、登录、解锁
开户:输入姓名、身份证号、设置密码,如果开户成功,则服务器上保存一个账号信号(一个账号存一个文件,文件名建议是账号)。
销户:输入帐号、密码,服务器询问是否确认销户,如果确认则服务器删除帐号文件,并记录帐号。
登录:输入账号、密码,三次错误账号锁定。
解锁:输入账号、身份证号解锁。
2、登录成功:存钱、取钱、转账、查询、修改密码
存钱:输入存钱金额
取钱:输入取钱金额
转账:目标帐号和要转的金额
查询:不需要输入数据
修改密码:原密码和新密码
服务器
如果识别功能:根据消息的类型识别客户端请求的功能。
开启服务各项功能的子进程
各进程按照消息类型接收消息
Makefile
FLAG=-Werror
STD=-std=gnu99
CC=gcc
all:
$(CC) $(STD) $(FLAG) client.c tools.c -o client
$(CC) $(STD) $(FLAG) server.c tools.c -o server
$(CC) $(STD) $(FLAG) login.c tools.c -o login
$(CC) $(STD) $(FLAG) open.c tools.c -o open
$(CC) $(STD) $(FLAG) save.c tools.c -o save
$(CC) $(STD) $(FLAG) take.c tools.c -o take
$(CC) $(STD) $(FLAG) transf.c tools.c -o transf
$(CC) $(STD) $(FLAG) select.c tools.c -o select
$(CC) $(STD) $(FLAG) change.c tools.c -o change
$(CC) $(STD) $(FLAG) destory.c tools.c -o destory
$(CC) $(STD) $(FLAG) unlock.c tools.c -o unlock
clean:
rm client server login open save take transf select change destory unlock
change.c 修改密码
destory.c 销毁用户
open.c 开户
select.c 查询
save.c 存款
take.c 取款
transf.c 转账
client.c 用户端
login.c 登陆
server.c 系统端
tools.c 一些工具函数
unlock.c 解锁
data(文件夹) 存储用户信息
Makefile 编译执行脚本
struct.h 结构体存储头文件 tools.h 工具函数头文件
此处所用getch.h的头文件为自建头文件(linux下没有conio.h头文件) 如果有需要可以私我
client.c 用户端
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include "struct.h"
#include "tools.h"
static long online = 0; //记录当前的用户
static int lock = 0; //密码错误的次数
int msgid_ctos; //消息队列的标识符
int msgid_stoc; //消息队列的标识符
int init(void); //创建消息队列
void open_acc(void); //开户操作
void destory(void); //销户操作
void login(void); //登录操作
void unlock(void); //解锁操作
void user_menu(void); //用户菜单
void menu(void); //菜单(开户,销户)
void save(void); //存钱
void take(void); //取钱
void transf(void); //转账
void select_money(void); //查询余额
void change_pw(void); //改变密码
int main()
{
init();
menu();
}
int init(void) //创建消息队列
{
//ftok是获取IPC键值
msgid_ctos = msgget(ftok(".",100),IPC_CREAT);
if(0 > msgid_ctos)
{
perror("msgget");
return -1;
}
msgid_stoc = msgget(ftok(".",200),IPC_CREAT);
if(0 > msgid_stoc)
{
perror("msgget");
return -1;
}
return 0;
}
void login(void) //登录操作
{
if(lock >= 3)
{
printf("您的账户已被锁定,请解锁\n");
getch();
return;
}
Account acc = {
};
Msg msg = {
110};
printf("请输入帐号:");
scanf("%ld",&acc.user);
getchar();
printf("请输入密码:");
get_pw(acc.pw,true,L_PW);
msg.acc = acc;
//发送消息
msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);
Msg msg2 = {
};
// 接收消息
msgrcv(msgid_stoc,&msg2,sizeof(Msg),220,MSG_NOERROR);
if(acc.user == msg2.acc.user)
{
online = acc.user;
printf("\n用户:%ld,登陆成功\n",online);
getch();
user_menu();
}
else
{
lock++;
printf("\n帐号或密码错误\n");
getch();
}
}
void open_acc(void) //开户操作
{
Account acc = {
};
Msg msg = {
111};
printf("请输入姓名:");
get_str(acc.name,L_NAME);
printf("请输入身份证:");
get_str(acc.id,L_ID);
printf("请输入密码:");
get_str(acc.pw,L_PW);
msg.acc = acc;
//发送消息
msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);
Msg msg2 = {
};
// 接收消息
msgrcv(msgid_stoc,&msg2,sizeof(Msg),221,MSG_NOERROR);
printf("msg2:%s,acc:%s\n",msg2.acc.name,acc.name);
if(strcmp(acc.name,msg2.acc.name) == 0)
{
printf("帐号:%ld,开户成功\n",msg2.acc.user);
}
else
{
printf("开户失败\n");
}
getch();
}
void save(void) //存款
{
Account acc = {
};
Msg msg = {
112};
printf("请输入存款金额:");
scanf("%lf",&acc.money);
getchar();
acc.user = online;
msg.acc = acc;
//发送消息
msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);
Msg msg2 = {
};
// 接收消息
msgrcv(msgid_stoc,&msg2,sizeof(Msg),222,MSG_NOERROR);
if(msg2.acc.user == online)
{
printf("存钱成功\n");
}
else
{
printf("存钱失败\n");
}
getch();
}
void take(void) //取款
{
Account acc = {
};
Msg msg = {
113};
printf("请输入取款金额:");
scanf("%lf",&acc.money);
getchar();
acc.user = online;
msg.acc = acc;
msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);
Msg msg2 = {
};
// 接收消息
msgrcv(msgid_stoc,&msg2,sizeof(Msg),223,MSG_NOERROR);
if(msg2.acc.user == online)
{
printf("取钱成功\n");
}
else if(msg2.acc.user == online + 2)
{
printf("余额不足,请充值\n");
}
else
{
printf("取钱失败\n");
}
getch();
}
void transf(void) //转账
{
Account acc = {
};
Msg msg = {
114};
printf("请输入转帐金额:");
scanf("%lf",&acc.money);
getchar();
acc.user = online;
msg.acc = acc;
msg.flag = 0;
msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);
Msg msg2 = {
};
// 接收消息
msgrcv(msgid_stoc,&msg2,sizeof(Msg),224,MSG_NOERROR);
if(msg2.flag == 0)
{
printf("请输入要转帐的帐号:");
scanf("%ld",&acc.user);
getchar();
msg.acc = acc;
msg.flag = 1;
msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);
// 接收消息
msgrcv(msgid_stoc,&msg2,sizeof(Msg),224,MSG_NOERROR);
if(msg2.flag == 2) printf("转帐成功\n");
else printf("转帐失败\n");
}
else
{
printf("余额不足\n");
}
getch();
}
void select_money(void) //余额查询
{
Account acc = {
};
Msg msg = {
115};
acc.user = online;
msg.acc = acc;
msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);
Msg msg2 = {
};
// 接收消息
msgrcv(msgid_stoc,&msg2,sizeof(Msg),225,MSG_NOERROR);
if(msg2.acc.user == online)
{
printf("余额:%.2lf\n",msg2.acc.money);
}
else
{
printf("查询失败\n");
}
getch();
}
void change_pw(void) //修改密码
{
Account acc = {
};
Msg msg = {
116};
printf("请输入新密码:");
get_pw(acc.pw,true,L_PW);
acc.user = online;
msg.acc = acc;
msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);
Msg msg2 = {
};
// 接收消息
msgrcv(msgid_stoc,&msg2,sizeof(Msg),226,MSG_NOERROR);
if(msg2.acc.user == online)
{
printf("\n改密成功\n");
}
else
{
printf(