网络版的ATM实现思路
客户端
1 #include "customer.h" 2 3 static int sockfd; 4 5 /*int create_msg_queue_c(int key) 6 { 7 //创建消息队列 8 int msgid = msgget(key,IPC_CREAT|0644); 9 if(0 > msgid) 10 { 11 perror("msgget"); 12 return -1; 13 } 14 return msgid; 15 }*/ 16 17 void show_menu(void) 18 { 19 printf("Welcome to Online Bank ! "); 20 printf("--------------------- "); 21 printf(" [1]开户 "); 22 printf(" [2]登录 "); 23 printf(" [3]解锁 "); 24 printf(" [4]销户 "); 25 printf(" [5]退出 "); 26 printf("--------------------- "); 27 } 28 //开户界面 29 void open_menu(void) 30 { 31 32 Msg msg = {99}; 33 //得到基本信息 34 printf("请输入姓名:"); 35 gets(msg.acc.name); 36 printf("请输入身份证号:"); 37 gets(msg.acc.idcard); 38 printf("请输入预存金额:"); 39 scanf("%f",&msg.acc.money); 40 //清空缓冲区 41 stdin->_IO_read_ptr = stdin->_IO_read_end; 42 strcpy(msg.acc.password,"123456"); 43 printf("%d ",msg.acc.account); 44 //将获得的基本信息发送到服务端 45 send(sockfd,&msg,sizeof(Msg),0); 46 //接收服务端传回的信息(账号id) 47 recv(sockfd,&msg,sizeof(Msg),0); 48 //perror("msgrcv"); 49 printf("*****您的id是%d,初始密码为123456,账号内的余额为%f***** ",msg.acc.account,msg.acc.money); 50 sleep(2); 51 } 52 //显示登陆后的功能界面 53 void func_menu(void) 54 { 55 printf("Welcome to Online Bank ! "); 56 printf("--------------------- "); 57 printf(" [1]存款 "); 58 printf(" [2]取款 "); 59 printf(" [3]转账 "); 60 printf(" [4]查询 "); 61 printf(" [5]修密 "); 62 printf(" [6]退出 "); 63 printf("--------------------- "); 64 } 65 //退出登录 66 void logout(int id) 67 { 68 69 Msg msg = {50}; 70 msg.acc.account = id; 71 send(sockfd,&msg,sizeof(Msg),0); 72 //接收服务端传回的信息(账号id) 73 recv(sockfd,&msg,sizeof(Msg),0); 74 printf("退出成功! "); 75 sleep(2); 76 } 77 //存钱界面 78 void save(int id) 79 { 80 Msg msg = {5}; 81 msg.acc.account = id; 82 printf("请输入要存的金额:"); 83 scanf("%f",&msg.acc.money); 84 //清空缓冲区 85 stdin->_IO_read_ptr = stdin->_IO_read_end; 86 //将获得的基本信息发送到服务端 87 send(sockfd,&msg,sizeof(Msg),0); 88 //接收服务端传回的信息(账号id) 89 recv(sockfd,&msg,sizeof(Msg),0); 90 printf("存款成功! "); 91 printf("*****您的id是%d,账号内的余额为%f***** ",msg.acc.account,msg.acc.money); 92 sleep(2); 93 } 94 //取款界面 95 void take(int id) 96 { 97 Msg msg = {6}; 98 msg.acc.account = id; 99 printf("请输入要取的金额:"); 100 scanf("%f",&msg.acc.money); 101 //清空缓冲区 102 stdin->_IO_read_ptr = stdin->_IO_read_end; 103 //将获得的基本信息发送到服务端 104 send(sockfd,&msg,sizeof(Msg),0); 105 //接收服务端传回的信息(账号id) 106 recv(sockfd,&msg,sizeof(Msg),0); 107 if(-1 == msg.acc.flag) 108 { 109 printf("取款失败! "); 110 sleep(2); 111 } 112 else 113 { 114 printf("取款成功! "); 115 printf("*****您的id是%d,账号内的余额为%f***** ",msg.acc.account,msg.acc.money); 116 sleep(2); 117 } 118 } 119 //转账界面 120 void trans(int id) 121 { 122 Msg msg1 = {7}; 123 //Msg msg2 = {17}; 124 msg1.acc.account = id; 125 printf("请输入转账对象的id:"); 126 scanf("%d",&msg1.acc.target); 127 //清空缓冲区 128 stdin->_IO_read_ptr = stdin->_IO_read_end; 129 printf("请输入要转账的金额:"); 130 scanf("%f",&msg1.acc.money); 131 //清空缓冲区 132 stdin->_IO_read_ptr = stdin->_IO_read_end; 133 //将获得的基本信息发送到服务端 134 send(sockfd,&msg1,sizeof(Msg),0); 135 //接收服务端传回的信息(账号id) 136 recv(sockfd,&msg1,sizeof(Msg),0); 137 switch(msg1.acc.flag) 138 { 139 case -1:printf("您的余额不足! ");sleep(2);break; 140 case -2:printf("转账对象不存在! ");sleep(2);break; 141 case 0: printf("转账成功! "); 142 printf("*****您的id是%d,账号内的余额为%f***** ",msg1.acc.account,msg1.acc.money); 143 sleep(2);break; 144 } 145 } 146 147 //查询界面 148 void show(int id) 149 { 150 system("clear"); 151 Msg msg = {8}; 152 msg.acc.account = id; 153 //将获得的基本信息发送到服务端 154 send(sockfd,&msg,sizeof(Msg),0); 155 //接收服务端传回的信息(账号id) 156 recv(sockfd,&msg,sizeof(Msg),0); 157 printf("%s用户您好! ",msg.acc.name); 158 printf("账号ID:%d ",msg.acc.account); 159 printf("身份证号:%s ",msg.acc.idcard); 160 printf("账号余额:%f ",msg.acc.money); 161 printf("*****按任意键返回***** "); 162 getchar(); 163 } 164 165 //修改密码界面 166 void change(int id) 167 { 168 Msg msg = {9}; 169 msg.acc.account = id; 170 printf("请输入您的身份账号以用于验证用户信息:"); 171 gets(msg.acc.idcard); 172 printf("请输入新密码(6位):"); 173 put_pw(msg.acc.password); 174 if(6 != strlen(msg.acc.password)) 175 { 176 printf("密码格式不符! "); 177 sleep(2); 178 return; 179 } 180 else 181 { 182 //将获得的基本信息发送到服务端 183 send(sockfd,&msg,sizeof(Msg),0); 184 //接收服务端传回的信息(账号id) 185 recv(sockfd,&msg,sizeof(Msg),0); 186 if(-1 == msg.acc.flag) 187 { 188 printf("修改失败! "); 189 sleep(2); 190 } 191 else 192 { 193 printf("修改成功! "); 194 sleep(2); 195 } 196 } 197 } 198 199 //副主界面 200 void ano_main(int id) 201 { 202 while(1) 203 { 204 system("clear"); 205 func_menu(); 206 switch(getch()) 207 { 208 case 49:save(id);break; 209 case 50:take(id);break; 210 case 51:trans(id);break; 211 case 52:show(id);break; 212 case 53:change(id);break; 213 case 54:logout(id);return; 214 } 215 } 216 } 217 //加载界面 218 void loading(void) 219 { 220 //system("clear"); 221 char buf[103] = {}; 222 memset(buf, ' ', sizeof(buf)); 223 buf[0] = '['; 224 buf[101] = ']'; 225 buf[102] = '