zoukankan      html  css  js  c++  java
  • Linux FIFO

    head.h:

     1 /* head */
     2 #include <unistd.h>
     3 #include <stdio.h>
     4 #include <stdlib.h>
     5 #include <string.h>
     6 #include <sys/types.h>
     7 #include <fcntl.h>
     8 #include <signal.h>
     9 #include <sys/stat.h>
    10 
    11 #define SERVER_FIFO "/tmp/server_fifo"
    12 #define LOGIN    0
    13 #define SEND    1
    14 
    15 typedef struct 
    16 {
    17     int service_type;
    18     char myfifo[50];
    19 
    20     union {
    21         struct {
    22             char username[50];
    23         }user ;
    24         struct {
    25             char name_src[50];
    26             char name_dst[50];
    27             char msg[100];
    28         }msg;
    29     } choose;
    30 }Message;
    31 
    32 typedef struct {
    33     char name[50];
    34     char fifo[50];
    35 }User;

    server.c

     1 #include "head.h"
     2 #define BUF_SIZE 100
     3 
     4 int ser_fifo;
     5 int i;
     6 int fd;
     7 int user_num ;
     8 char buffer[BUF_SIZE];
     9 Message message;
    10 User users[10];
    11 
    12 void init(){
    13     if(access(SERVER_FIFO, F_OK) == -1){
    14         if(mkfifo(SERVER_FIFO, 0777) == -1){
    15             perror("init-access-mkfifo");
    16             exit(1);
    17         }
    18     }
    19 
    20     if((ser_fifo = open(SERVER_FIFO, O_RDONLY | O_NONBLOCK)) == -1){
    21         perror("init-open");
    22         exit(1);
    23     }
    24 }
    25 
    26 
    27 void sendBuffer(){
    28 
    29     if((fd = open(message.myfifo, O_WRONLY | O_NONBLOCK)) == -1){
    30         perror("sendBuffer-open");
    31         exit(1);
    32     }
    33     if(write(fd, buffer, strlen(buffer)+1) == -1){
    34         perror("serndBuffer-write");
    35     }
    36     close(fd);
    37 }
    38 
    39 void login(){
    40     for (i = 0; i < user_num; ++i)
    41     {
    42         if(strcmp(message.choose.user.username, users[i].name) == 0){
    43             strcpy(buffer,"1,the user has existed");
    44             break;
    45         }
    46     }
    47 
    48     if(i == user_num)
    49         strcpy(buffer ,"0,login success");
    50     strcpy(users[user_num].name, message.choose.user.username);
    51     strcpy(users[user_num++].fifo, message.myfifo);
    52 
    53     sendBuffer();
    54 }
    55 
    56 void send(){
    57     for (i = 0; i < user_num; ++i)
    58     {
    59         if(strcmp(message.choose.msg.name_dst, users[i].name) == 0)
    60             break;
    61     }
    62     if(i == user_num)
    63         strcpy(buffer, "the user is not exist! i=user_num");
    64     else{
    65         if((fd = open(users[i].fifo, O_WRONLY | O_NONBLOCK)) == -1){
    66             perror("send-open");
    67             exit(1);
    68         }
    69         sprintf(buffer, "from %s: %s\n", message.choose.msg.name_src,message.choose.msg.msg);
    70         if(write(fd, buffer, BUF_SIZE) == -1){
    71             perror("send-write");
    72             exit(1);
    73         }
    74         close(fd);
    75         strcpy(buffer, "send success !!");
    76     }
    77     sendBuffer();
    78 }
    79 
    80 void operation(int type){
    81     if(type == LOGIN) login();
    82     else if(type == SEND) send();
    83 }
    84 
    85 int main(int argc, char const *argv[])
    86 {
    87     init();
    88     while(1){
    89         if((read(ser_fifo, &message, sizeof(Message) + 50))>0){
    90             operation(message.service_type);
    91         }
    92     }
    93     return 0;
    94 }

    client.c:

      1 #include "head.h"
      2 #define BUF_SIZE 100
      3 char mypipename[100];
      4 char myname[50];
      5 char buffer[BUF_SIZE];
      6 int ser_fifo;
      7 int my_fifo;
      8 Message message;
      9 
     10 
     11 void init(){
     12     if(access(SERVER_FIFO, F_OK) == -1){
     13         perror("init-access");
     14         exit(1);
     15     }
     16 
     17     ser_fifo = open(SERVER_FIFO, O_WRONLY);
     18     if(ser_fifo == -1){
     19         perror("init-open");
     20         exit(1);
     21     }
     22 
     23     sprintf(mypipename, "/tmp/client%d_fifo", getpid());
     24 //    printf("%s",mypipename);
     25     if(mkfifo(mypipename, 0777) == -1){
     26         perror("init-mkfifo");
     27         exit(1);
     28     }
     29 
     30     my_fifo = open(mypipename, O_RDONLY | O_NONBLOCK);
     31     if(my_fifo == -1){
     32         perror("open my fifo");
     33         exit(1);
     34     }
     35 
     36     strcpy(message.myfifo, mypipename);
     37 }
     38 
     39 void sendMessage(){
     40     if(write(ser_fifo, &message, sizeof(Message)) == -1){
     41         perror("sendMessage-write");
     42         exit(1);
     43     }
     44 }
     45 
     46 recMessage(){
     47     int res;
     48     if((res = read(my_fifo, buffer, BUF_SIZE)) == -1){
     49         perror("recMessage-read");
     50         exit(1);
     51     }
     52     return res;
     53 }
     54 
     55 int login(){
     56     message.service_type = LOGIN;
     57     printf("username: ");
     58     scanf("%s", message.choose.user.username);
     59     sendMessage();
     60     while(recMessage() == 0) ;
     61     printf("%s\n", buffer);
     62     if(buffer[0] == '0'){
     63         strcpy(myname, message.choose.user.username);
     64         return 0;
     65     }
     66     return -1;
     67 }
     68 
     69 void send(){
     70     message.service_type = SEND;
     71     printf("message to : ");
     72     scanf("%s", message.choose.msg.name_dst);
     73     printf("The message is :\n");
     74     getchar();
     75     fgets(message.choose.msg.msg, 100, stdin);
     76     strcpy(message.choose.msg.name_src, myname);
     77     sendMessage();
     78 }
     79 
     80 int main(int argc, char const *argv[])
     81 {
     82     init();
     83     while(login()!= 0);
     84     int pid;
     85     if((pid = fork()) == -1){
     86         perror("main-fork");
     87         exit(1);
     88     }
     89 
     90     if(pid == 0){
     91         while(1){
     92             if(recMessage() > 0)
     93                 printf("%s\n", buffer);
     94         }
     95     }
     96     else{
     97         while(1){
     98             sleep(1);
     99             send();
    100         }
    101     }
    102     return 0;
    103 }
  • 相关阅读:
    spring3.1, hibernate4.1 配置备份,struts2.2.1,sitemesh 2.4.2
    java 动态AOP
    制作可以执行的 JAR 文件包及 jar 命令详解
    struts result Annotation 参考
    Android线段与矩形碰撞检测函数
    防止aspxspy木马列服务 iis信息 执行命令提权等操作
    博客园申请及页面定制CSS
    C# 中将月份格式化为英语缩写格式
    通过Web Service获取天气预报并朗读
    windows下html/javascript调用可执行程序
  • 原文地址:https://www.cnblogs.com/firstrate/p/3120233.html
Copyright © 2011-2022 走看看