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
相关推荐
Shanks.2 小时前
2026 远程控制软件实测:ToDesk / 向日葵 / RustDesk / TeamViewer 在跨城与弱网下的真实差距
网络·远程工作·软件需求
Jeremy_WW3 小时前
802.3协议解读 06:117章节 RS 和 200GMII / 400GMII I
网络·网络协议·信息与通信·光模块·802.3协议
坤坤子吖4 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
顧棟4 小时前
INFINI Gateway 服务器端口重用(SO_REUSEPORT)实现与分析
网络·gateway
沫璃染墨5 小时前
从零入门计算机网络系列(十八):TCP连接管理详解——从三次握手与四次挥手到TIME_WAIT机制
运维·服务器·网络·c++·网络协议·tcp/ip·tcp
LabVIEW开发6 小时前
Omron PLC:接 LabVIEW 常踩的 5 个坑
服务器·网络·labview·labview知识·labview功能·labview程序
南京码讯光电技术有限公司6 小时前
工业5G/4G路由器怎么选?核心参数解析与工业级网关选购指南
网络·智能路由器
爱和冰阔落6 小时前
【Linux网络】JsonCpp 怎么实现序列化?从 Request/Response 到网络计算器消息设计
linux·运维·网络·php
feng_you_ying_li20 小时前
linux之数据链路层
linux·网络·智能路由器
国科安芯1 天前
人在回路中的总线:商业空间站环境控制与生命保障系统CANFD网络的可靠性与功能安全
网络·嵌入式硬件·安全·架构·php·抗辐射