• Linux系统编程:客户端-服务器用FIFO进行通信


    先放下代码  回来在解释

    头文件:

    clientinfo.h

    1 struct CLIENTINFO{
    2     char myfifo[500];
    3     int leftarg;
    4     int rightarg;
    5     char op;
    6 }; 
    7 typedef struct CLIENTINFO CLIENTINFO, *CLINTINFOPTR;


    client.c

     1 #include <unistd.h>
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 #include <string.h>
     5 #include <sys/types.h>
     6 #include <fcntl.h>
     7 #include <signal.h>
     8 #include "clientinfo.h"
     9 
    10 #define FIFO_NAME "/home/levi/chatapplication/data/server_fifo/chat_server_fifo"
    11 #define BUFF_SZ 100
    12 
    13 char mypipename[BUFF_SZ];
    14 void handler(int sig){
    15     unlink(mypipename);
    16     exit(1);
    17 }
    18 
    19 int main(int argc, char const *argv[])
    20 {
    21     int res;
    22     int fifo_fd, my_fifo;
    23     int fd;
    24     CLIENTINFO info;
    25     char buffer[BUFF_SZ];
    26 
    27     signal(SIGKILL, handler);
    28     signal(SIGINT, handler);
    29     signal(SIGTERM, handler);
    30 
    31     if(argc != 4){
    32         printf("Usage: %s op1 operation op2
    ", argv[0]);
    33         exit(1);
    34     }
    35     if(access(FIFO_NAME, F_OK) == -1){
    36         printf("Could not open FIFO %s
    ", FIFO_NAME);
    37         exit(EXIT_FAILURE);
    38     }
    39     fifo_fd = open(FIFO_NAME, O_WRONLY);
    40     if(fifo_fd == -1){
    41         printf("Could not open %s for write access
    ", FIFO_NAME);
    42         exit(EXIT_FAILURE);
    43     }
    44     sprintf(mypipename, "/home/levi/chat_client_%d_fifo", getpid());
    45     res = mkfifo(mypipename, 0777);
    46     if(res != 0){
    47         printf("FIFO %s was not created
    ", buffer);
    48         exit(EXIT_FAILURE);
    49     }
    50 
    51     my_fifo = open(mypipename, O_RDONLY | O_NONBLOCK);
    52     if(my_fifo == -1){
    53         printf("Could not open %s for read only access
    ", FIFO_NAME);
    54         exit(EXIT_FAILURE);
    55     }
    56 
    57     strcpy(info.myfifo, mypipename);
    58     info.leftarg = atoi(argv[1]);
    59     info.op = argv[2][0];
    60     info.rightarg = atoi(argv[3]);
    61 
    62     write(fifo_fd, &info, sizeof(CLIENTINFO));
    63     close(fifo_fd);
    64 
    65     memset(buffer, '', BUFF_SZ);
    66     while(1){
    67         res = read(my_fifo, buffer, BUFF_SZ);
    68         if(res > 0){
    69             printf("Received from server : %s
    ", buffer);
    70             break;
    71         }
    72     }
    73     printf("Client %d is terminating
    ", getpid());
    74     close(my_fifo);
    75     (void)unlink(mypipename);
    76     return 0;
    77 }

    server.c

     1 #include <unistd.h>
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 #include <string.h>
     5 #include <sys/types.h>
     6 #include <fcntl.h>
     7 #include <signal.h>
     8 #include "clientinfo.h"
     9 
    10 #define FIFO_NAME "/home/levi/server_fifo/chat_server_fifo"
    11 void handler(int sig){
    12     unlink(FIFO_NAME);
    13     exit(1);
    14 }
    15 
    16 int calc(CLIENTINFOPTR info){
    17     switch(info->op){
    18         case '+' : return info->leftarg + info->rightarg;
    19         case '-' : return info->leftarg - info->rightarg;
    20         case '*' : return info->leftarg * info->rightarg;
    21         case '/' : return info->leftarg / info->rightarg;
    22     }
    23     return 0;
    24 }
    25 
    26 int main(int argc, char const *argv[])
    27 {
    28     int res, i, fifo_fd, fd1;
    29     CLIENTINFO info;
    30     char buffer[100];
    31     signal(SIGKILL, handler);
    32     signal(SIGINT, handler);
    33     signal(SIGTERM, handler);
    34     if(access(FIFO_NAME, F_OK) == -1){
    35         res = mkfifo(FIFO_NAME, 0777);
    36         if(res != 0){
    37             printf("FIFO %s was not created
    ", FIFO_NAME);
    38             exit(EXIT_FAILURE);
    39         }
    40     }
    41     fifo_fd = open(FIFO_NAME, O_RDONLY);
    42     if(fifo_fd == -1){
    43         printf("Could not open %s for read only access
    ", FIFO_NAME);
    44         exit(EXIT_FAILURE);
    45     }
    46     printf("
    Server is rarin to go !
    ");
    47     while(1){
    48         res = read(fifo_fd, &info, sizeof(CLIENTINFO));
    49         if(res != 0){
    50             printf("Client arrived!!
    ");
    51             sprintf(buffer, "The result is %d", calc(&info));
    52             fd1 = open(info.myfifo, O_WRONLY | O_NONBLOCK);
    53             write (fd1, buffer, strlen(buffer) + 1);
    54             close(fd1);
    55         }
    56 
    57     }
    58     return 0;
    59 }


    OK!

    ./server.c &

    ./client 3 + 5

      看输出吧!

  • 相关阅读:
    Python基础之迭代器、生成器
    Python基础之模块+异常
    Python基础之面向对象思维解决游戏《天龙八部》
    Oracle创建存储过程
    数据库范式
    Oracle条件判断
    Oracle的三种循环
    Oracle的pl/sql变量类型
    oracle如何实现去重和分页
    相关子查询和非相关子查询
  • 原文地址:https://www.cnblogs.com/firstrate/p/3287527.html
Copyright © 2020-2023  润新知