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

  看输出吧!

原文地址:https://www.cnblogs.com/firstrate/p/3287527.html