SX_UNIX套接字通信_15

UNIX套接字通信的优势:

UNIX套接字通信常用于一个项目中的进程之间通信,UNIX提供了与网络套接字相似的特性,但是避免了网络延迟,提高了性能,但是它只能在同一台机器上使用,无法跨越网络的进程间通信

实例:

服务端代码:

c 复制代码
// server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>

#define SOCKET_PATH "/tmp/my_socket"

int main() {
    struct sockaddr_un addr;
    int fd,cl,rc;
    char buffer[100];

    // 创建UNIX域流套接字
    if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
        perror("socket error");
        exit(EXIT_FAILURE);
    }

    // 初始化地址结构
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);

    // 绑定地址
    unlink(SOCKET_PATH); // 确保之前的套接字文件已删除
    if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
        perror("bind error");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(fd, 5) == -1) {
        perror("listen error");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 接受客户端连接
    if ((cl = accept(fd, NULL, NULL)) == -1) {
        perror("accept error");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 读取客户端发送的消息
    rc = read(cl, buffer, sizeof(buffer));
    if (rc > 0) {
        printf("Received message: %s\n", buffer);
    } else {
        perror("read error");
    }

    // 关闭连接和套接字
    close(cl);
    close(fd);
    unlink(SOCKET_PATH); // 删除套接字文件

    return 0;
}

客户端代码:

c 复制代码
// client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>


// 地址要与服务器一致 
#define SOCKET_PATH "/tmp/my_socket"

int main(int argc, char* argv[]) {
	
	// 判断是否有数据传输 
	if(argc < 2){
		printf("send message is null\n");
		return -1;
	}
	
    struct sockaddr_un addr;
    int fd,rc;
    char buffer[100];
    strcpy(buffer, argv[1]); 

    // 创建UNIX域流套接字
    if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
        perror("socket error");
        exit(EXIT_FAILURE);
    }

    // 初始化地址结构
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);

    // 连接到服务器
    if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
        perror("connect error");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 发送消息到服务器
    rc = write(fd, buffer, strlen(buffer));
    if (rc > 0) {
        printf("Sent message to server: %s\n", buffer);
    } else {
        perror("write error");
    }

    // 关闭套接字
    close(fd);

    return 0;
}

注意:
服务端主要进行套接字的创建、绑定、监听,最后阻塞接收客户端的连接请求,需要注意的是UNIX套接字路径要明确文件位置,文件名可以不存在,但是父目录要存在,可以指定./路径或者为/tmp的Linux系统临时文件目录,sockaddr_un结构体只需指定地址族和路径名就可以用,客户端主要与服务端进行连接,创建套接字,设置连接条件,尝试连接即可

运行效果:

bash 复制代码
# 终端1
./server
receive msg is: 你好
bash 复制代码
# 终端2
./client 你好
sent msg to server is: 你好
相关推荐
眠修13 分钟前
Kuberrnetes 服务发布
linux·运维·服务器
好奇的菜鸟1 小时前
Docker 配置项详解与示例
运维·docker·容器
xcs194051 小时前
集运维 麒麟桌面版v10 sp1 2403 aarch64 离线java开发环境自动化安装
运维·自动化
BAOYUCompany2 小时前
暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
运维·服务器
超龄超能程序猿2 小时前
Bitvisse SSH Client 安装配置文档
运维·ssh·github
奈斯ing2 小时前
【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案
运维·redis·缓存·数据库架构
鳄鱼皮坡3 小时前
仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
运维·服务器
即将头秃的程序媛3 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
小Mie不吃饭3 小时前
FastAPI 小白教程:从入门级到实战(源码教程)
运维·服务器
fo安方4 小时前
运维的利器–监控–zabbix–第三步:配置zabbix–中间件–Tomcat–步骤+验证
运维·中间件·zabbix