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

系统 1631 0

先放下代码  回来在解释

头文件:

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\n
      
      
        "
      
      , argv[
      
        0
      
      
        ]);


      
      
        33
      
               exit(
      
        1
      
      
        );


      
      
        34
      
      
            }


      
      
        35
      
      
        if
      
      (access(FIFO_NAME, F_OK) == -
      
        1
      
      
        ){


      
      
        36
      
               printf(
      
        "
      
      
        Could not open FIFO %s\n
      
      
        "
      
      
        , 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\n
      
      
        "
      
      
        , 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\n
      
      
        "
      
      
        , 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\n
      
      
        "
      
      
        , 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, 
      
        '
      
      
        \0
      
      
        '
      
      
        , BUFF_SZ);


      
      
        66
      
      
        while
      
      (
      
        1
      
      
        ){


      
      
        67
      
               res =
      
         read(my_fifo, buffer, BUFF_SZ);


      
      
        68
      
      
        if
      
      (res > 
      
        0
      
      
        ){


      
      
        69
      
                   printf(
      
        "
      
      
        Received from server : %s\n
      
      
        "
      
      
        , buffer);


      
      
        70
      
      
        break
      
      
        ;


      
      
        71
      
      
                }


      
      
        72
      
      
            }


      
      
        73
      
           printf(
      
        "
      
      
        Client %d is terminating\n
      
      
        "
      
      
        , 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\n
      
      
        "
      
      
        , 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\n
      
      
        "
      
      
        , FIFO_NAME);


      
      
        44
      
      
                exit(EXIT_FAILURE);


      
      
        45
      
      
            }


      
      
        46
      
           printf(
      
        "
      
      
        \nServer is rarin to go !\n
      
      
        "
      
      
        );


      
      
        47
      
      
        while
      
      (
      
        1
      
      
        ){


      
      
        48
      
               res = read(fifo_fd, &info, 
      
        sizeof
      
      
        (CLIENTINFO));


      
      
        49
      
      
        if
      
      (res != 
      
        0
      
      
        ){


      
      
        50
      
                   printf(
      
        "
      
      
        Client arrived!!\n
      
      
        "
      
      
        );


      
      
        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

  看输出吧!

 

 

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论