在这里,我们还是需要一个管道,只不过,我们只需这一个管道,即可知道,客户端有哪些上线、对话、下线等。

服务器端的实现代码如下:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <sys/stat.h>
  5 #include <sys/types.h>
  6 #include <fcntl.h>
  7 #include <sys/time.h>
  8 #include <sys/select.h>
  9 #include <errno.h>
 10 #define ON 1
 11 #define OFF 0
 12 int errno;
 13 typedef struct tag
 14 {
 15     int id;
 16     int fd;
 17     int type;
 18 }NODE;
 19 int main(int argc, const char *argv[])
 20 {
 21     if(mkfifo(argv[1], 0666) == -1)
 22     {
 23         printf("创建管道失败!!\n");
 24         exit(1);
 25     }
 26     
 27     int fd;
 28     fd = open(argv[1], O_RDONLY);
 29     if(fd == -1)
 30     {
 31         printf("open error!!\n");
 32         exit(1);
 33     }
 34     NODE list[1024];
 35     int i;
 36     for(i = 0; i< 1024; i ++)
 37     {
 38         list[i].id = 0;
 39         list[i].type = OFF;
 40         list[i].fd = 0;
 41     }
 42     fd_set readset, ready;
 43     FD_ZERO(&readset);
 44     FD_ZERO(&ready);
 45     FD_SET(fd, &readset);
 46     struct timeval tm;
 47     char buf[128];
 48     int ret;
 49     while(1)
 50     {
 51         ready = readset;
 52         tm.tv_sec = 0;
 53         tm.tv_usec = 1000;
 54         ret = select(fd + 1, &ready, NULL, NULL, &tm);
 55         if(ret == 0)
 56             continue;
 57         else if(ret == -1)
 58         {
 59             if(errno == EINTR)
 60                 continue;
 61             break;
 62         }
 63         else
 64         {
 65             memset(buf, 0, 128);
 66             read(fd, buf, 128);
 67             if(strncmp(buf, "on", 2) == 0)
 68             {
 69                 int sfd;
 70                 char name[128];
 71                 memset(name, 0, 128);
 72                 sscanf(buf + 3, "%d", &sfd);
 73                 printf(" %d is on !!\n", sfd);
 74                 sprintf(name, "%d.fifo", sfd);
 75                 int index;
 76                 for(index = 0; index < 1024; index ++)
 77                 {
 78                     if(list[index].type == OFF)
 79                     {
 80                         list[index].id = sfd;
 81                         list[index].fd = open(name, O_WRONLY);
 82                         list[index].type = ON;
 83                         break;
 84                     }
 85                 }
 86             }
 87             else if(strncmp(buf, "off", 3) == 0)
 88             {
 89                 int sfd;
 90                 sscanf(buf + 4, "%d", &sfd);
 91                 printf("%d is off !!\n", sfd);
 92                 int index;
 93                 for(index = 0; index <1024; index ++)
 94                 {
 95                     if(list[index].id == sfd)
 96                     {
 97                         close(list[index].fd);
 98                         list[index].id = 0;
 99                         list[index].type = OFF;
100                         break;
101                     }
102                 }
103             }
104             else
105             {
106                 int sfd;
107                 sscanf(buf + 5, "%d", &sfd);
108                 int index;
109                 for(index = 0; index < 1024; index ++)
110                 {
111                     if(list[index].type == ON && list[index].id != sfd)
112                         write(list[index].fd, buf, strlen(buf));
113                 }
114             }
115         }
116     }
117     close(fd);
118     unlink(argv[1]);
119     return 0;
120 }
View Code

相关文章: