項目需求
主要分為兩人大子產品:
用戶端
1、進入時的功能開戶、銷戶、登入、解鎖
開戶:輸入姓名、身份證号、設定密碼,如果開戶成功,則伺服器上儲存一個賬号信号(一個賬号存一個檔案,檔案名建議是賬号)。
銷戶:輸入帳号、密碼,伺服器詢問是否确認銷戶,如果确認則伺服器删除帳号檔案,并記錄帳号。
登入:輸入賬号、密碼,三次錯誤賬号鎖定。
解鎖:輸入賬号、身份證号解鎖。
2、登入成功:存錢、取錢、轉賬、查詢、修改密碼
存錢:輸入存錢金額
取錢:輸入取錢金額
轉賬:目标帳号和要轉的金額
查詢:不需要輸入資料
修改密碼:原密碼和新密碼
伺服器
如果識别功能:根據消息的類型識别用戶端請求的功能。
開啟服務各項功能的子程序
各程序按照消息類型接收消息
頭檔案
#define key 123456
帳号結構體
{
帳号
身份證号
密碼
金額
}
消息結構體
{
消息類型
帳号結構體
}
系統實作方法
系統分為用戶端和伺服器,用戶端用于接收使用者輸入的資訊,伺服器建立多個子程序,用于實作各項功能
使用者在用戶端輸入資訊,通過程序間通信傳給伺服器,伺服器接收後,用相應的子程序實作功能,并将實作的情況傳回給用戶端
碼雲:下載下傳位址
代碼使用:下載下傳後解壓放到linux中,打開兩個終端,都進入到xxbank/server檔案夾中,輸入make,産生相應檔案,先在一個終端中輸入./server,運作伺服器,在另一個終端輸入./client運作用戶端,然後就可以開始使用了(如果出錯可能是消息隊列沒有清除,請清除後再運作)
功能展示
開戶

銷戶
登入
解鎖
存錢
取錢
轉賬
查詢餘額
修改密碼
部分代碼展示
//client.c 代碼
#include <stdio.h>
#include <unistd.h>
#include <msg.h>
#include <bank.h>
#include <getch.h>
#include <string.h>
#include <stdlib.h>
#define STDIN_CLEAR stdin ->_IO_read_ptr = stdin -> _IO_read_end
//按任意按鍵繼續
void anykey_continue(void)
{
puts("按任意按鍵繼續...");
//防止輸入緩沖區中有殘留的字元,會導緻getch直接傳回
//是以清理輸入緩沖區
STDIN_CLEAR;
getch();
}
//接受資料并去除fgets()末尾的\n
void fgets_n(char* str,int n)
{
STDIN_CLEAR;
memset(str, 0, strlen(str));
fgets(str,n,stdin);
if(str[n-1]=='\n')
{
str[n-1]='\0';
}
STDIN_CLEAR;
}
int msgid;
MsgCTOS ctos = {};
MsgSTOC stoc = {};
void menu(void)
{
puts("歡迎使用XX銀行");
puts("1 開戶");
puts("2 銷戶");
puts("3 登陸");
puts("4 解鎖");
puts("0 退出");
}
void open(void)
{
ctos.type = OPEN_MSG;
printf("請輸入身份證号:");
fgets_n(ctos.user.card_id,19);
printf("請輸入密碼(6位純數字):");
fgets_n(ctos.user.passwd,7);
printf("msg=%d\n",msgid);
send_msg(msgid,&ctos,sizeof(MsgCTOS));
recv_msg(msgid,&stoc,sizeof(MsgSTOC),getpid());
printf("status:%d\n%s\n",stoc.status,stoc.str);
anykey_continue();
}
void destory(void)
{
ctos.type = DESTORY_MSG;
printf("請輸入銀行卡号:");
fgets_n(ctos.user.bank_id,16);
printf("請輸入密碼:");
fgets_n(ctos.user.passwd,7);
printf("msg=%d\n",msgid);
send_msg(msgid,&ctos,sizeof(MsgCTOS));
recv_msg(msgid,&stoc,sizeof(MsgSTOC),getpid());
printf("status:%d\n%s\n",stoc.status,stoc.str);
anykey_continue();
}
void login(void)
{
ctos.type = LOGIN_MSG;
printf("請輸入銀行卡号:");
fgets_n(ctos.user.bank_id,16);
printf("請輸入密碼:");
fgets_n(ctos.user.passwd,7);
printf("msg=%d\n",msgid);
send_msg(msgid,&ctos,sizeof(MsgCTOS));
recv_msg(msgid,&stoc,sizeof(MsgSTOC),getpid());
printf("status:%d\n%s\n",stoc.status,stoc.str);
sleep(1);
}
void unlock(void)
{
ctos.type = UNLOCK_MSG;
printf("請輸入銀行卡号:");
fgets_n(ctos.user.bank_id,16);
printf("請輸入身份證号:");
fgets_n(ctos.user.card_id,19);
printf("msg=%d\n",msgid);
send_msg(msgid,&ctos,sizeof(MsgCTOS));
recv_msg(msgid,&stoc,sizeof(MsgSTOC),getpid());
printf("status:%d\n%s\n",stoc.status,stoc.str);
sleep(1);
}
void save(void)
{
ctos.type = SAVE_MSG;
printf("請輸入存錢金額:");
scanf("%lf",&ctos.user.balance);
send_msg(msgid,&ctos,sizeof(MsgCTOS));
recv_msg(msgid,&stoc,sizeof(MsgSTOC),getpid());
printf("status:%d\n%s\n",stoc.status,stoc.str);
anykey_continue();
}
void take(void)
{
ctos.type = TAKE_MSG;
printf("請輸入取錢金額:");
scanf("%lf",&ctos.user.balance);
send_msg(msgid,&ctos,sizeof(MsgCTOS));
recv_msg(msgid,&stoc,sizeof(MsgSTOC),getpid());
printf("status:%d\n%s\n",stoc.status,stoc.str);
anykey_continue();
}
void turn(void)
{
ctos.type = TURN_MSG;
printf("請輸入轉帳卡号:");
fgets_n(ctos.user.card_id,16);
printf("請輸入轉帳金額:");
scanf("%lf",&ctos.user.balance);
send_msg(msgid,&ctos,sizeof(MsgCTOS));
recv_msg(msgid,&stoc,sizeof(MsgSTOC),getpid());
printf("status:%d\n%s\n",stoc.status,stoc.str);
anykey_continue();
}
void query(void)
{
ctos.type = QUERY_MSG;
send_msg(msgid,&ctos,sizeof(MsgCTOS));
recv_msg(msgid,&stoc,sizeof(MsgSTOC),getpid());
printf("status:%d\n%s\n",stoc.status,stoc.str);
anykey_continue();
}
void change(void)
{
ctos.type = CHANGE_MSG;
printf("請輸入修改後的密碼(6位純數字):");
fgets_n(ctos.user.passwd,7);
send_msg(msgid,&ctos,sizeof(MsgCTOS));
recv_msg(msgid,&stoc,sizeof(MsgSTOC),getpid());
printf("status:%d\n%s\n",stoc.status,stoc.str);
anykey_continue();
}
void user_menu(void)
{
for(;;)
{
system("clear");
puts("使用者界面");
puts("1 存錢");
puts("2 取錢");
puts("3 轉帳");
puts("4 查詢");
puts("5 改密");
puts("0 退出");
char cmd = getch();
switch(cmd)
{
case '1':save();break;
case '2':take();break;
case '3':turn();break;
case '4':query();break;
case '5':change();break;
case '0':return;
default:break;
}
}
}
int main()
{
msgid = get_msg(MSGKEY);
ctos.pid = getpid();
for(;;)
{
system("clear");
menu();
char cmd = getch();
switch(cmd)
{
case '1':open();break;
case '2':destory();break;
case '3':
login();
if(0 == stoc.status)
{
user_menu();
}
break;
case '4':unlock();break;
case '0':return 0;
default:break;
}
}
}