网络版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
",queue_c2s);
12         //接收客户端登录输入的信息
13         msgrcv(queue_c2s,&msg1,sizeof(Msg),9,0);
14         printf("激活修改
");
15         char str[20] = {};
16         //查询文件是否存在
17         int fd = open(get_file_name(msg1.acc.account,str),O_EXCL|O_RDWR,00644);
18         printf("%d
",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
",queue_c2s);
12         //接收客户端登录输入的信息
13         msgrcv(queue_c2s,&msg1,sizeof(Msg),4,0);
14         printf("激活销户
");
15         char str[20] = {};
16         //查询文件是否存在
17         int fd = open(get_file_name(msg1.acc.account,str),O_EXCL|O_RDWR,00644);
18         printf("%d
",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("错误
");
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
",queue_c2s);
12         //接收客户端登录输入的信息
13         msgrcv(queue_c2s,&msg1,sizeof(Msg),2,0);
14         printf("激活登录
");
15         char str[20] = {};
16         //查询文件是否存在
17         int fd = open(get_file_name(msg1.acc.account,str),O_EXCL|O_RDWR,00644);
18         printf("%d
",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---
",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("正确
");
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("已在其他客户端登录
");
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
",msg2.acc.flag);
65                     printf("错误
");
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
");
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
",queue_c2s);
12         //接收客户端登录输入的信息
13         msgrcv(queue_c2s,&msg1,sizeof(Msg),50,0);
14         printf("激活退出
");
15         printf("id=%d
",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
",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连接成功!
",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
",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客户端退出
",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
",fdp);
153         if(0 > fdp) perror("fdp");
154         int i;
155         for(i=0; i<3; i++)
156         {
157             printf("wojinruxunhuanle
");
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
",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("我等到了
");
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
",queue_c2s);
        //接收客户端开户输入的信息
        msgrcv(queue_c2s,&msg1,sizeof(Msg),6,0);
        printf("激活取款
");
        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
",queue_c2s);
16         //接收客户端开户输入的信息
17         msgrcv(queue_c2s,&msg1,sizeof(Msg),7,0);
18         //msgrcv(queue_c2s,&msg2,sizeof(Msg),17,0);
19         printf("激活转账
");
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
",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
",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
");
56                 msgsnd(queue_s2c,&msg11,sizeof(Msg)-4,0);
57                 printf("%ld===
",msg11.type);
58             }
59         }
60     }
61 }
原文地址:https://www.cnblogs.com/kid971220/p/10497818.html