网络版ATM项目的实现——服务端
作者:互联网
修改
1 #include "tools.h" 2 3 int main() 4 { 5 int queue_s2c = create_msg_queue(key1); 6 int queue_c2s = create_msg_queue(key2); 7 while(1) 8 { 9 Msg msg1 = {}; 10 Msg msg2 = {}; 11 printf("等待修改 %d\n",queue_c2s); 12 //接收客户端登录输入的信息 13 msgrcv(queue_c2s,&msg1,sizeof(Msg),9,0); 14 printf("激活修改\n"); 15 char str[20] = {}; 16 //查询文件是否存在 17 int fd = open(get_file_name(msg1.acc.account,str),O_EXCL|O_RDWR,00644); 18 printf("%d\n",fd); 19 read(fd,&msg2,sizeof(Msg)); 20 if(0 != strcmp(msg1.acc.idcard,msg2.acc.idcard)) 21 { 22 msg1.acc.flag = -1; 23 msg1.type = 100; 24 msgsnd(queue_s2c,&msg1,sizeof(Msg)-4,0); 25 } 26 else 27 { 28 strcpy(msg2.acc.password,msg1.acc.password); 29 lseek(fd,0,SEEK_SET); 30 write(fd,&msg2,sizeof(Msg)); 31 msg2.type = 100; 32 msgsnd(queue_s2c,&msg2,sizeof(Msg)-4,0); 33 } 34 close(fd); 35 } 36 }
删除
1 #include "tools.h" 2 3 int main() 4 { 5 int queue_s2c = create_msg_queue(key1); 6 int queue_c2s = create_msg_queue(key2); 7 while(1) 8 { 9 Msg msg1 = {}; 10 Msg msg2 = {}; 11 printf("等待销户 %d\n",queue_c2s); 12 //接收客户端登录输入的信息 13 msgrcv(queue_c2s,&msg1,sizeof(Msg),4,0); 14 printf("激活销户\n"); 15 char str[20] = {}; 16 //查询文件是否存在 17 int fd = open(get_file_name(msg1.acc.account,str),O_EXCL|O_RDWR,00644); 18 printf("%d\n",fd); 19 //不存在则发送"登录失败"信息 20 if(0 > fd) 21 { 22 msg1.acc.flag = -1; 23 msg1.type = 100; 24 msgsnd(queue_s2c,&msg1,sizeof(Msg)-4,0); 25 } 26 //存在则读取文件中结构体,判断密码是否正确 27 else 28 { 29 read(fd,&msg2,sizeof(Msg)); 30 close(fd); 31 //密码正确 32 if(0 == strcmp(msg1.acc.password,msg2.acc.password)) 33 { 34 unlink(get_file_name(msg1.acc.account,str)); 35 msg2.type = 100; 36 msg2.acc.flag = -2; 37 msgsnd(queue_s2c,&msg2,sizeof(Msg)-4,0); 38 } 39 //密码错误 40 else 41 { 42 msg2.type = 100; 43 msg2.acc.flag = -1; 44 msgsnd(queue_s2c,&msg2,sizeof(Msg)-4,0); 45 printf("错误\n"); 46 } 47 } 48 49 } 50 51 }
登陆
1 #include "tools.h" 2 3 int main() 4 { 5 int queue_s2c = create_msg_queue(key1); 6 int queue_c2s = create_msg_queue(key2); 7 while(1) 8 { 9 Msg msg1 = {}; 10 Msg msg2 = {}; 11 printf("等待登录 %d\n",queue_c2s); 12 //接收客户端登录输入的信息 13 msgrcv(queue_c2s,&msg1,sizeof(Msg),2,0); 14 printf("激活登录\n"); 15 char str[20] = {}; 16 //查询文件是否存在 17 int fd = open(get_file_name(msg1.acc.account,str),O_EXCL|O_RDWR,00644); 18 printf("%d\n",fd); 19 //不存在则发送"登录失败"信息 20 if(0 > fd) 21 { 22 msg1.acc.flag = -1; 23 msg1.type = 100; 24 msgsnd(queue_s2c,&msg1,sizeof(Msg)-4,0); 25 } 26 //存在则读取文件中结构体,判断密码是否正确 27 else 28 { 29 read(fd,&msg2,sizeof(Msg)); 30 //printf("%d---%s---%s---%f---\n",msg2.acc.account,msg2.acc.name,msg2.acc.password,msg2.acc.money); 31 //密码正确 32 if(3 > msg2.acc.flag && 0 == strcmp(msg1.acc.password,msg2.acc.password)) 33 { 34 35 if(0 == msg2.acc.sp) 36 { 37 msg2.acc.flag = 0; 38 msg2.type = 100; 39 msgsnd(queue_s2c,&msg2,sizeof(Msg)-4,0); 40 msg2.acc.sp=1; 41 lseek(fd,0,SEEK_SET); 42 write(fd,&msg2,sizeof(Msg)); 43 printf("正确\n"); 44 } 45 else 46 { 47 msg2.acc.sp=1; 48 msg2.acc.flag = 0; 49 msg2.type = 100; 50 msgsnd(queue_s2c,&msg2,sizeof(Msg)-4,0); 51 printf("已在其他客户端登录\n"); 52 } 53 } 54 //密码错误 55 else 56 { 57 if(0 == msg2.acc.sp) 58 { 59 msg2.acc.flag++; 60 msg2.type = 100; 61 msgsnd(queue_s2c,&msg2,sizeof(Msg)-4,0); 62 lseek(fd,0,SEEK_SET); 63 write(fd,&msg2,sizeof(Msg)); 64 printf("flag = %d\n",msg2.acc.flag); 65 printf("错误\n"); 66 } 67 else 68 { 69 msg2.acc.flag=0; 70 msg2.type = 100; 71 msgsnd(queue_s2c,&msg2,sizeof(Msg)-4,0); 72 printf("错误lllll\n"); 73 74 } 75 } 76 } 77 close(fd); 78 } 79 }
登出
1 #include "tools.h" 2 3 int main() 4 { 5 int queue_s2c = create_msg_queue(key1); 6 int queue_c2s = create_msg_queue(key2); 7 while(1) 8 { 9 Msg msg1 = {}; 10 Msg msg2 = {}; 11 printf("等待退出 %d\n",queue_c2s); 12 //接收客户端登录输入的信息 13 msgrcv(queue_c2s,&msg1,sizeof(Msg),50,0); 14 printf("激活退出\n"); 15 printf("id=%d\n",msg1.acc.account); 16 char str[20] = {}; 17 //打开文件 18 int fd = open(get_file_name(msg1.acc.account,str),O_EXCL|O_RDWR,00644); 19 read(fd,&msg2,sizeof(Msg)); 20 msg2.acc.sp = 0; 21 lseek(fd,0,SEEK_SET); 22 write(fd,&msg2,sizeof(Msg)); 23 printf("已退出 sp=%d\n",msg2.acc.sp); 24 close(fd); 25 msg2.type = 100; 26 msgsnd(queue_s2c,&msg2,sizeof(Msg)-4,0); 27 } 28 }
服务
1 #include "service.h" 2 #include "tools.h" 3 4 static int queue_s2c; 5 static int queue_c2s; 6 pid_t pid_usr[11] = {}; 7 8 typedef struct sockaddr SockAddr; 9 int fd[3] = {}; 10 sem_t sem; 11 char ip[3][20] = {}; 12 struct sockaddr_in from_addr; 13 14 void sigint(int signum) 15 { 16 if(0 > msgctl(queue_s2c,IPC_RMID,NULL)) 17 { 18 perror("msgctl1"); 19 exit(0); 20 } 21 if(0 > msgctl(queue_c2s,IPC_RMID,NULL)) 22 { 23 perror("msgctl2"); 24 exit(0); 25 } 26 for(int i=1; i<11; i++) 27 { 28 kill(pid_usr[i],SIGKILL); 29 } 30 exit(0); 31 } 32 33 void* start(void* arg) 34 { 35 int i = *(int*)arg;//fdp 36 if(0 > i) 37 { 38 perror("accetp"); 39 return NULL; 40 } 41 printf("客户端:%s连接成功!\n",inet_ntoa(from_addr.sin_addr)); 42 sem_wait(&sem); 43 int temp=0; 44 for(int j=0; j<3; j++) 45 { 46 if(fd[j] == i) temp=j; 47 } 48 strcpy(ip[temp],inet_ntoa(from_addr.sin_addr)); 49 printf("ip[temp][] = %s\n",ip[temp]); 50 // 收发数据 51 while(true) 52 { 53 char buf[1024] = {}; 54 Msg msg = {}; 55 int ret = recv(i,&msg,sizeof(msg),0); 56 if(0 >= ret) 57 { 58 printf("%s客户端退出\n",ip[temp]); 59 fd[temp]=0; 60 sem_post(&sem); 61 break; 62 } 63 msgsnd(queue_c2s,&msg,sizeof(Msg)-4,0); 64 msgrcv(queue_s2c,&msg,sizeof(Msg),100,0); 65 send(i,&msg,sizeof(Msg),0); 66 } 67 } 68 69 int main() 70 { 71 signal(SIGINT,sigint); 72 73 queue_s2c = create_msg_queue(key1); 74 queue_c2s = create_msg_queue(key2); 75 76 77 Msg msg = {}; 78 79 pid_usr[1] = vfork(); 80 if(0 == pid_usr[1]) 81 execl("open","open",NULL); 82 83 pid_usr[2] = vfork(); 84 if(0 == pid_usr[2]) 85 execl("log_in","log_in",NULL); 86 87 pid_usr[3] = vfork(); 88 if(0 == pid_usr[3]) 89 execl("unlock","unlock",NULL); 90 91 pid_usr[4] = vfork(); 92 if(0 == pid_usr[4]) 93 execl("delete","delete",NULL); 94 95 pid_usr[5] = vfork(); 96 if(0 == pid_usr[5]) 97 execl("save","save",NULL); 98 99 pid_usr[6] = vfork(); 100 if(0 == pid_usr[6]) 101 execl("take","take",NULL); 102 103 pid_usr[7] = vfork(); 104 if(0 == pid_usr[7]) 105 execl("trans","trans",NULL); 106 107 pid_usr[8] = vfork(); 108 if(0 == pid_usr[8]) 109 execl("show","show",NULL); 110 111 pid_usr[9] = vfork(); 112 if(0 == pid_usr[9]) 113 execl("change","change",NULL); 114 115 pid_usr[10] = vfork(); 116 if(0 == pid_usr[10]) 117 execl("log_out","log_out",NULL); 118 119 120 //s_c_socket 绑定 121 122 //signal(SIGINT,sigint); 123 sem_init(&sem,0,3); 124 // 创建socket对象 125 int sockfd = socket(AF_INET,SOCK_STREAM,0); 126 if(0 > sockfd) 127 { 128 perror("socket"); 129 return -1; 130 } 131 // 准备通信地址 132 struct sockaddr_in addr = {}; 133 addr.sin_family = AF_INET; 134 addr.sin_port = htons(1904); 135 addr.sin_addr.s_addr = inet_addr("192.168.1.110"); 136 137 // 绑定socket对象与通信地址 138 socklen_t len = sizeof(addr); 139 if(0 > bind(sockfd,(SockAddr*)&addr,len)) 140 { 141 perror("bind"); 142 return -1; 143 } 144 // 设置监听socket对象 145 listen(sockfd,10); 146 int fdp = 0; 147 //int i = 0; 148 // 等待连接 149 while(true) 150 { 151 if(fdp == 0) fdp = accept(sockfd,(SockAddr*)&from_addr,&len); 152 printf("%d\n",fdp); 153 if(0 > fdp) perror("fdp"); 154 int i; 155 for(i=0; i<3; i++) 156 { 157 printf("wojinruxunhuanle\n"); 158 if(0 == fd[i]) 159 { 160 fd[i] = fdp; 161 pthread_t pid = 0; 162 //创建子线程 163 pthread_create(&pid,NULL,start,&fd[i]); 164 char _buf[1024] = "欢迎进入聊天室"; 165 //send(fdp,_buf,strlen(_buf)+1,0); 166 fdp=0; 167 break; 168 } 169 } 170 printf("%d\n",i); 171 if(3 <= i) 172 { 173 char _buf[1024] = "聊天室满,请稍等..."; 174 send(fdp,_buf,strlen(_buf)+1,0); 175 sem_wait(&sem); 176 sem_post(&sem); 177 printf("我等到了\n"); 178 } 179 } 180 181 182 183 184 }
取钱
#include "tools.h" int main() { int queue_s2c = create_msg_queue(key1); int queue_c2s = create_msg_queue(key2); while(1) { //存储收到的结构体信息 Msg msg1 = {}; //存储文件中读取的信息 Msg msg2 = {}; printf("等待取款 %d\n",queue_c2s); //接收客户端开户输入的信息 msgrcv(queue_c2s,&msg1,sizeof(Msg),6,0); printf("激活取款\n"); char str[20] = {}; int fd = open(get_file_name(msg1.acc.account,str),O_EXCL|O_RDWR,00644); read(fd,&msg2,sizeof(Msg)); if(msg2.acc.money < msg1.acc.money) { msg1.acc.flag = -1; msg1.type = 100; msgsnd(queue_s2c,&msg1,sizeof(Msg)-4,0); } else { msg2.acc.money = msg2.acc.money-msg1.acc.money; lseek(fd,0,SEEK_SET); write(fd,&msg2,sizeof(Msg)); perror("write"); close(fd); //将账户结构体信息发送至客户端 msg2.type = 100; msgsnd(queue_s2c,&msg2,sizeof(Msg)-4,0); } } }
转账
1 #include "tools.h" 2 3 int main() 4 { 5 int queue_s2c = create_msg_queue(key1); 6 int queue_c2s = create_msg_queue(key2); 7 while(1) 8 { 9 //存储收到的结构体1信息 10 Msg msg1 = {}; 11 Msg msg11 = {}; 12 //存储收到的结构体2信息 13 Msg msg2 = {}; 14 Msg msg22 = {}; 15 printf("等待转账 %d\n",queue_c2s); 16 //接收客户端开户输入的信息 17 msgrcv(queue_c2s,&msg1,sizeof(Msg),7,0); 18 //msgrcv(queue_c2s,&msg2,sizeof(Msg),17,0); 19 printf("激活转账\n"); 20 char str1[20] = {}; 21 int fd1 = open(get_file_name(msg1.acc.account,str1),O_EXCL|O_RDWR,00644); 22 read(fd1,&msg11,sizeof(Msg)); 23 printf("fd1:%d\n",fd1); 24 if(msg11.acc.money < msg1.acc.money) 25 { 26 msg1.acc.flag = -1;//钱不够 27 msg1.type = 100; 28 close(fd1); 29 msgsnd(queue_s2c,&msg1,sizeof(Msg)-4,0); 30 } 31 else 32 { 33 char str2[20] = {}; 34 int fd2 = open(get_file_name(msg1.acc.target,str2),O_EXCL|O_RDWR,00644); 35 printf("fd2:%d\n",fd2); 36 if(0 > fd2) 37 { 38 msg1.acc.flag = -2;//转账对象不存在 39 msg1.type = 100; 40 msgsnd(queue_s2c,&msg1,sizeof(Msg)-4,0); 41 } 42 else 43 { 44 read(fd2,&msg22,sizeof(Msg)); 45 msg22.acc.money = msg22.acc.money+msg1.acc.money; 46 lseek(fd2,0,SEEK_SET); 47 write(fd2,&msg22,sizeof(Msg)); 48 close(fd2); 49 msg11.acc.money = msg11.acc.money-msg1.acc.money; 50 lseek(fd1,0,SEEK_SET); 51 write(fd1,&msg11,sizeof(Msg)); 52 close(fd1); 53 msg11.acc.flag = 0;//操作成功 54 msg11.type = 100; 55 printf("right\n"); 56 msgsnd(queue_s2c,&msg11,sizeof(Msg)-4,0); 57 printf("%ld===\n",msg11.type); 58 } 59 } 60 } 61 }
标签:acc,msg1,网络版,msg2,ATM,queue,Msg,sizeof,服务端 来源: https://www.cnblogs.com/kid971220/p/10497818.html