• 跨进程通讯之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   //再运行客户端

  • 相关阅读:
    禅道开源改造
    [Angular 基础] - routing 路由(上)
    matlab预测股票价格走势
    汉泰示波器软件|汉泰示波器上位机软件NS-Scope,任意添加测量数据
    Anycloud37D平台移植wpa_supplicant
    go-05-常量
    鹏哥C语言36-37---循环/分支语句练习(折半查找算法)
    2023第二届中国能源管理&碳中和国际峰会
    C++类和动态数组
    Python | Leetcode Python题解之第203题移除链表元素
  • 原文地址:https://blog.csdn.net/professionIT/article/details/132860030