天天看點

LINUX下的銀行小系統(C語言)(程序間通信,多程序)

項目需求

主要分為兩人大子產品:

用戶端
	1、進入時的功能開戶、銷戶、登入、解鎖
		開戶:輸入姓名、身份證号、設定密碼,如果開戶成功,則伺服器上儲存一個賬号信号(一個賬号存一個檔案,檔案名建議是賬号)。
		銷戶:輸入帳号、密碼,伺服器詢問是否确認銷戶,如果确認則伺服器删除帳号檔案,并記錄帳号。
		登入:輸入賬号、密碼,三次錯誤賬号鎖定。
		解鎖:輸入賬号、身份證号解鎖。
	2、登入成功:存錢、取錢、轉賬、查詢、修改密碼
		存錢:輸入存錢金額
		取錢:輸入取錢金額
		轉賬:目标帳号和要轉的金額
		查詢:不需要輸入資料
		修改密碼:原密碼和新密碼
伺服器
	如果識别功能:根據消息的類型識别用戶端請求的功能。
	開啟服務各項功能的子程序
		各程序按照消息類型接收消息
	
頭檔案

#define key 123456

帳号結構體
{
	帳号
	身份證号
	密碼
	金額
}

消息結構體
{
	消息類型
	帳号結構體
}

           

系統實作方法

系統分為用戶端和伺服器,用戶端用于接收使用者輸入的資訊,伺服器建立多個子程序,用于實作各項功能

使用者在用戶端輸入資訊,通過程序間通信傳給伺服器,伺服器接收後,用相應的子程序實作功能,并将實作的情況傳回給用戶端

碼雲:下載下傳位址

代碼使用:下載下傳後解壓放到linux中,打開兩個終端,都進入到xxbank/server檔案夾中,輸入make,産生相應檔案,先在一個終端中輸入./server,運作伺服器,在另一個終端輸入./client運作用戶端,然後就可以開始使用了(如果出錯可能是消息隊列沒有清除,請清除後再運作)

功能展示

開戶

LINUX下的銀行小系統(C語言)(程式間通信,多程式)

銷戶

LINUX下的銀行小系統(C語言)(程式間通信,多程式)

登入

LINUX下的銀行小系統(C語言)(程式間通信,多程式)

解鎖

LINUX下的銀行小系統(C語言)(程式間通信,多程式)

存錢

LINUX下的銀行小系統(C語言)(程式間通信,多程式)

取錢

LINUX下的銀行小系統(C語言)(程式間通信,多程式)

轉賬

LINUX下的銀行小系統(C語言)(程式間通信,多程式)

查詢餘額

LINUX下的銀行小系統(C語言)(程式間通信,多程式)

修改密碼

LINUX下的銀行小系統(C語言)(程式間通信,多程式)

部分代碼展示

//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;
		}
	}
}
           

繼續閱讀