zoukankan      html  css  js  c++  java
  • 网络版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 }
  • 相关阅读:
    Java笔记(二十一) 动态代理
    Java笔记(二十) 注解
    Java笔记(十九) 反射
    Java笔记(十八)同步和协作工具类
    Java笔记(十七) 异步任务执行服务
    Spring使用笔记(四) 面向切面的Spring
    Spring使用笔记(三) 高级装配
    Java笔记(十六)并发容器
    Java笔记(十五) 并发包
    Java笔记(十四) 并发基础知识
  • 原文地址:https://www.cnblogs.com/kid971220/p/10497818.html
Copyright © 2011-2022 走看看