IPC使用套接字进程通讯

cpp 复制代码
#include<stdlib.h>
#include<stdio.h>
#include<stddef.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/stat.h>
#include<errno.h>
#include<string.h>
#include<unistd.h>

#define SOCKET_PAHT "unix_domain.socket"
#define SERVER_MODE 1
#define CLIENT_MODE 2
#define BUF_LEN 1024

static struct sockaddr_un socket_addr;
static char *buf;

void handle_error(char *err_msg)
{
    perror(err_msg);
    unlink(SOCKET_PAHT);
    exit(-1);
}

void server_mode(int sockfd)
{
    //服务端接收消息 收到EOF表示结束
    struct sockaddr_un client_addr;
    int client_fd ,msg_len,tmep_result;
    //1、绑定
    tmep_result = bind(sockfd,(struct sockaddr *)&socket_addr,sizeof(socket_addr));
    if (tmep_result < 0)
    {
        handle_error("bind");
    }
    //2、挂起监听
    tmep_result = listen(sockfd,120);
    if (tmep_result < 0)
    {
        handle_error("listen");
    }
    //3、获取连接
    socklen_t client_len = sizeof(client_addr);
    client_fd = accept(sockfd,(struct sockaddr *)&client_addr,&client_len);
    if (client_fd < 0)
    {
        handle_error("accept");
    }
    printf("接收到客户端的连接\n");
    do
    {
        //接收数据到缓存
        memset(buf,0,1024);
        //接收数据
        msg_len = recv(client_fd,buf,BUF_LEN,0);
        if (msg_len < 0)
        {
            handle_error("recv");
        }
        
        if (strncmp(buf,"EOF",3) != 0)
        {
            printf("接收到客户端信息:%s\n",buf);
            strcpy(buf,"OK\n\0");
        }
        else
        {
            printf("收到EOF,停止接收数据\n");
        }
        //回复OK或者EOF
        tmep_result = send(client_fd,buf,strlen(buf),0);
        if (tmep_result < 0)
        {
            handle_error("send");
        }

    } while (strncmp(buf,"EOF",3));
    unlink(SOCKET_PAHT);
    
}

void client_mode(int sockfd)
{
    //客户端发送消息 发送EOF表示结束
    int temp_result , msg_len;
    //连接服务端
    temp_result = connect(sockfd,(struct sockaddr*)&socket_addr,sizeof(socket_addr));
    if(temp_result < 0)
    {
        handle_error("connect");
    }
    do
    {
        printf("请输入要发送的数据\n");

        msg_len = read(STDIN_FILENO,buf,BUF_LEN);
        temp_result = send(sockfd,buf,BUF_LEN,0);
        if (temp_result < 0)
        {
            handle_error("send");
        }
        //清空缓存
        memset(buf,0,BUF_LEN);
        recv(sockfd,buf,BUF_LEN,0);
        printf("接收到服务端回复的消息:%s\n",buf);

    } while (strncmp(buf,"EOF",3) != 0);
    
    temp_result = shutdown(sockfd,SHUT_WR);
    if (temp_result < 0)
    {
        handle_error("shutdown");
    }
    
}

int main(int argc, char const *argv[])
{
    int mode = 0 , sockfd;
    //设计结构
    //通过main方法传参的方式 启动不同的客户端和服务端
    //如果不填写参数 或者填写参数是server
    if (argc == 1 || strncmp(argv[1],"sever",6) == 0)
    {
        mode = SERVER_MODE;
    }
    else if(strncmp(argv[1],"client",6) == 0)
    {
        mode = CLIENT_MODE;
    }
    else
    {
        perror("参数错误");
        exit(EXIT_FAILURE);
    }

    //创建socket ipc通讯
    //清空
    memset(&socket_addr,0,sizeof(socket_addr));
    buf = malloc(BUF_LEN);

    socket_addr.sun_family=AF_UNIX;
    strcpy(socket_addr.sun_path,SOCKET_PAHT);
    sockfd = socket(AF_UNIX,SOCK_STREAM,0);
    if (sockfd < 0)
    {
        handle_error("socket");
    }
    

    switch (mode)
    {
    case SERVER_MODE:
        server_mode(sockfd);
        break;

    case CLIENT_MODE:
        client_mode(sockfd);
        break;

    default:
        break;
    }
    
    close(sockfd);
    free(buf);

    return 0;
}

makefile

cpp 复制代码
socket_ipc_test:socket_ipc_test.c
	-$(CC) -o $@ $^ -lpthread
相关推荐
80s7772 小时前
动态ip和静态ip有什么区别
服务器·网络·tcp/ip
鲁邦通物联网2 小时前
出海物联网设备的全球化网络接入与合规脱敏架构:基于 Node-RED 与 C++ 零拷贝的边缘系统设计
网络·物联网·系统架构·边缘计算·边缘计算网关·5g数采·工业级边缘计算网关
星恒讯工业路由器2 小时前
家庭无线组网方式全解析:从单路由到FTTR,哪种适合你?
网络·物联网·智能路由器·路由器·家庭组网·ac+ap·mesh组网
0566462 小时前
agent学习——流式响应与文本切分
网络·python·学习
mqiqe2 小时前
AgentScope Java 2.0 Agent 状态存储(AgentStateStore)深度解析:构建可恢复、可扩展的智能体运行时
java·运维·网络
不会就选b5 小时前
Linux之网络基础(二)
linux·运维·网络
今儿敲了吗5 小时前
CN——网络层(上)
网络·笔记
莫浅子6 小时前
Day 4:USB 2.0 时序与带宽预算
linux·运维·网络
新手unity自用笔记6 小时前
unity基于Socket的网络学习
网络·网络协议·学习·unity·c#·游戏引擎
XUEYUAN52126 小时前
Cloudflare 防护机制深度剖析与跨境数据采集工程化实践
服务器·网络·网络协议·tcp/ip·http