📄 client.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 + -