• 跨进程通讯之Unix Socket通讯


    1、unix_client.c代码

    #include <stdlib.h>

    #include <stdio.h>

    #include

    #include socket.h>

    #include

    #include

    #include

    #include

    #define MAXLINE 80

    char *client_path = "client-socket";

    char *server_path = "server-socket";

    int main() {

            struct  sockaddr_un cliun, serun;

            int len;

            char buf[100];

            int sockfd, n;

            if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){

                    perror("client socket error");

                    exit(1);

            }

        memset(&serun, 0, sizeof(serun));

        serun.sun_family = AF_UNIX;

        strncpy(serun.sun_path,server_path ,

                       sizeof(serun.sun_path) - 1);

        if (connect(sockfd, (struct sockaddr *)&serun, sizeof(struct sockaddr_un)) < 0){

            perror("connect error");

            exit(1);

        }

        printf("please input send char:");

        while(fgets(buf, MAXLINE, stdin) != NULL) {

             write(sockfd, buf, strlen(buf));

             n = read(sockfd, buf, MAXLINE);//读不到了就为0

             if ( n <= 0 ) {

                printf("the other side has been closed.\n");

                break;

             }else {

                printf("received from server: %s \n",buf);

             }

             printf("please input send char:");

        }

        close(sockfd);

        return 0;

    }

    2、unix_socket.c代码

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #define MAXLINE 80

    char *socket_path = "server-socket";

    int main()

    {

        struct sockaddr_un serun, cliun;

        socklen_t cliun_len;

        int listenfd, connfd, size;

        char buf[MAXLINE];

        int i, n;

        if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {

            perror("socket error");

            exit(1);

        }

        memset(&serun, 0, sizeof(serun));

        serun.sun_family = AF_UNIX;

        strncpy(serun.sun_path,socket_path ,

                       sizeof(serun.sun_path) - 1);

        unlink(socket_path);//这个相当于把之前的地址要移除,不然上一个server没有结束,移除会报错already in use

        if (bind(listenfd, (struct sockaddr *)&serun, sizeof(struct sockaddr_un)) < 0) {

            perror("bind error");

            exit(1);

        }

        printf("UNIX domain socket bound\n");

        if (listen(listenfd, 20) < 0) {

            perror("listen error");

            exit(1);

        }

        printf("Accepting connections ...\n");

        while(1) {

            cliun_len = sizeof(cliun);

            if ((connfd = accept(listenfd, (struct sockaddr *)&cliun, &cliun_len)) < 0){

                perror("accept error");

                continue;

            }

            printf("new client connect to server,client sockaddr === %s \n",((struct sockaddr *)&cliun)->sa_data);

            while(1) {

                memset(buf,0,sizeof(buf));

                n = read(connfd, buf, sizeof(buf));

                if (n < 0) {

                    perror("read error");

                    break;

                } else if(n == 0) {

                    printf("EOF\n");

                    break;

                }

                printf("received: %s\n", buf);

                

                if(strncmp(buf,"quit",4)==0){

                    break;

                }

                for(i = 0; i < n; i++) {

                    buf[i] = toupper(buf[i]);

                }

                write(connfd, buf, n);

            }

            close(connfd);

        }

        close(listenfd);

        return 0;

    }

    3、命令

    编译:

    gcc unix_client.c -o unix_client

    gcc unix_socket.c -o unix_socket

    运行:

    ./unix_socket  //先运行服务端,服务端运行起来,客户端才能连接

    ./unix_client   //再运行客户端

  • 相关阅读:
    基于SpringBoot医院信息管理系统源码
    Vue-Pinia
    uniapp生成自定义(分享)图片并保存到相册
    映翰通C++ 一面(技术面、65min、offer)
    1.http和https
    2310月问题描述
    【精读Uboot】SPL阶段的board_init_r详细分析
    python常用命令
    代码随想录算法训练营第十三天|239. 滑动窗口最大值、 347.前 K 个高频元素
    Vulnhub_driftingblues1靶机渗透测试
  • 原文地址:https://blog.csdn.net/professionIT/article/details/132860030