⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.c

📁 本实验模拟ATM取款功能。本程序比较简单
💻 C
字号:
//client
/****************************************************
 * 《ATM 服务模型客户端代码》						*
 *				2003级计算机4班 030300639	许贻福	*
 *										2005.12.28	*
 ****************************************************/#include<unistd.h>#include<stdlib.h>#include<curses.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include<sys/shm.h>#define	  MSGKEYS 2//the client's key#define   MSGKEYR 1//the server's key#define   SHMKEY  3 #define   MAXNUM  6  #define	  PSWSIZE 6struct msgform{    long mtype;   	unsigned int	 mtext[256];}msnd,mrcv;typedef struct{    unsigned int no;    char name[20];   	char password[PSWSIZE];    unsigned int money;}people;people *addr;int pid,shmid,sndid,rcvid;unsigned int no;int identifyPassword();void checkAccount();void modifyPassWord();void drawMoney();void transfer();
main(){	int choice,go_on;	shmid=shmget(SHMKEY,sizeof(people)*MAXNUM,IPC_CREAT);    addr=(people*)shmat(shmid,0,0);					sndid=msgget(MSGKEYS,IPC_CREAT|0600);//建立客户端的消息队列,对应KEY=2			rcvid=msgget(MSGKEYR,IPC_CREAT|0666);//建立与服务端相同的消息队列,对应KEY=1	pid=getpid();	while(1)	{		go_on=1;			printf("\nATM 欢迎您!\n");		printf("请输入您的帐号:");		scanf("%u",&no);		if(no<1||no>MAXNUM)		{			printf("错误!帐户不存在\n");			continue;		}		if(identifyPassword()==0)		{			printf("密码出错三次,请离开!\n");				continue;		}		printf("现在正为 %s 服务....\n",addr[no-1].name);		while(go_on)		{			printf("可供服务:\n");			printf("\t1.查询余额\n\t2.修改密码\n\t3.取钱\n\t4.转帐\n\t5.退出\n");			printf("请选择:");			scanf("%d",&choice);			switch(choice)			{				case 1:checkAccount();break;				case 2:modifyPassWord();break;        		case 3:drawMoney();break;				case 4:transfer();break;				case 5:go_on=0;break;				default:;			}		}		printf("%s 离开服务...\n",addr[no-1].name);	}}int goOn(){	char c;	printf("是否继续?('Y/N'):");	while(c=getchar())	{		switch(c)		{			case 'y':			case 'Y':return 1;			case 'n':			case 'N':return 0;			default:;		}	}}int identifyPassword(){	char psw[PSWSIZE];	int count=3;	while(count-->0)	{		printf("请输入您的密码:(%dbit)",PSWSIZE);		scanf("%s",&psw);		if(strcmp(addr[no-1].password,psw)==0)			return 1;		else			printf("错误!密码不正确\n");	}	return 0;		}void checkAccount(){	printf("正在查询...\n");	sleep(1);//	printf("您还剩:%u元\n",addr[no-1].money);	}void modifyPassWord(){	int i;    char psw[PSWSIZE],npsw[PSWSIZE];    printf("新密码:(%dbit)",PSWSIZE);	scanf("%s",psw);   	printf("再一次:");	scanf("%s",npsw);    if(strcmp(psw,npsw)==0)	{			printf("正在修改密码...\n");		sleep(1);//   		msnd.mtype=1;		msnd.mtext[0]=pid;		msnd.mtext[1]=no;		for(i=0;i<PSWSIZE;i++)			msnd.mtext[2+i]=psw[i];		while(msgsnd(sndid,&msnd,256,0)==-1);//发送请求消息		msgrcv(rcvid,&mrcv,256,pid,0);//接收反馈消息   		printf("%s\n",(char*)mrcv.mtext);	}	else		printf("错误! 您的输入不一致\n");}void drawMoney(){	unsigned int m,mm;	m=addr[no-1].money;    printf("您还剩:%u元\n",m);	printf("欲取金额:");	scanf("%u",&mm);	if(mm<=m)	{			printf("正在取钱...\n");		sleep(1);//		msnd.mtype=2;		msnd.mtext[0]=pid;		msnd.mtext[1]=no;		msnd.mtext[2]=mm;		while(msgsnd(sndid,&msnd,256,0)==-1);//发送请求消息		msgrcv(rcvid,&mrcv,256,pid,0);//接收反馈消息		printf("%s\n",(char*)mrcv.mtext); 	}	else		printf("对不起!您的余额不足\n");}void transfer(){		unsigned int m,mm,no1; 	m=addr[no-1].money;    printf("您还剩:%u元\n",m);	printf("转向帐户:");	scanf("%u",&no1);	if(no1<1||no1>MAXNUM)		printf("帐户不存在!\n");	else	{			printf("欲转金额:");		scanf("%u",&mm);   		if(mm<=m)   		{			printf("请再仔细确认一次!\n");			printf("您将转 %u 元给帐户%u\n",mm,no1);			if(goOn())			{					printf("正在转帐...\n");				sleep(1);   				msnd.mtype=3;				msnd.mtext[0]=pid;				msnd.mtext[1]=no;				msnd.mtext[2]=mm;				msnd.mtext[3]=no1;				while(msgsnd(sndid,&msnd,256,0)==-1);//发送请求消息    			msgrcv(rcvid,&mrcv,256,pid,0);//接收反馈消息   				printf("%s\n",(char*)mrcv.mtext);			}			else				printf("取消转帐操作\n");		}		else			printf("对不起!您的余额不足\n");	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -