首页 > 运维 > linux运维 > 正文

Linux如何使用Unix域套接字通信_Linux本地进程通信教程

尊渡假赌尊渡假赌尊渡假赌
发布: 2025-11-25 19:07:02
原创
501人浏览过
Unix域套接字是Linux系统中用于本地进程间通信的高效机制,它通过文件系统路径标识端点,不经过网络协议栈,具有更高的性能和安全性。支持流式(SOCK_STREAM)和数据报(SOCK_DGRAM)两种模式,常用于数据库服务、守护进程等本地服务通信场景。与TCP/IP套接字不同,UDS仅在主机内部通信,避免了网络开销且更安全。创建UDS服务端需调用socket()创建套接字,bind()绑定到指定路径(如/tmp/my_socket),listen()监听连接,accept()接收客户端连接并读取数据。客户端则通过socket()创建连接,connect()连接到服务端地址,并使用write()发送数据。编译C语言示例代码后,先运行服务端再运行客户端,可实现消息传递。注意事项包括:使用unlink()删除旧套接字文件防止绑定失败,设置适当权限控制访问,可通过ls查看套接字文件属性(类型为s)。掌握Unix域套接字的基本流程有助于在高性能、高安全需求的应用中实现可靠的本地IPC通信。

linux如何使用unix域套接字通信_linux本地进程通信教程

Unix域套接字是Linux系统中实现本地进程间通信(IPC)的一种高效方式,它不经过网络协议,直接在操作系统内核中完成数据传输,因此比TCP/IP套接字更快速、更安全。适用于同一台机器上的进程通信,比如数据库服务与客户端、守护进程与管理工具之间的交互。

什么是Unix域套接字

Unix域套接字(Unix Domain Socket, 简称UDS)是一种用于在同一台主机上进行进程间通信的机制。它支持流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM),类似于TCP和UDP,但只在本地使用,通过文件系统中的一个路径名来标识通信端点。

与网络套接字不同,Unix域套接字不会暴露在网络中,因此更加安全,且避免了网络开销。

创建Unix域套接字的服务端

以下是一个简单的C语言示例,展示如何编写一个使用流式Unix域套接字的服务端程序:

步骤说明:
  • 创建套接字:使用socket(AF_UNIX, SOCK_STREAM, 0)
  • 绑定地址:将套接字绑定到一个文件路径(如/tmp/my_socket
  • 监听连接:调用listen()
  • 接受连接并读取数据

服务端代码片段:

#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    int server_fd, client_fd;
    struct sockaddr_un addr;
    char buffer[1024];

    // 创建Unix域套接字
    server_fd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (server_fd == -1) {
        perror("socket");
        exit(1);
    }

    // 设置地址结构
    addr.sun_family = AF_UNIX;
    snprintf(addr.sun_path, sizeof(addr.sun_path), "/tmp/my_socket");

    // 如果套接字文件已存在,先删除
    unlink(addr.sun_path);

    // 绑定
    if (bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
        perror("bind");
        close(server_fd);
        exit(1);
    }

    // 监听
    if (listen(server_fd, 5) == -1) {
        perror("listen");
        close(server_fd);
        exit(1);
    }

    printf("等待客户端连接...\n");
    client_fd = accept(server_fd, NULL, NULL);
    if (client_fd == -1) {
        perror("accept");
        close(server_fd);
        exit(1);
    }

    // 读取客户端消息
    int len = read(client_fd, buffer, sizeof(buffer)-1);
    if (len > 0) {
        buffer[len] = '\0';
        printf("收到消息: %s\n", buffer);
    }

    // 清理
    close(client_fd);
    close(server_fd);
    unlink(addr.sun_path); // 删除套接字文件
    return 0;
}
登录后复制

编写客户端连接Unix域套接字

客户端程序负责连接到服务端创建的Unix域套接字,并发送数据。

Clipfly
Clipfly

一站式AI视频生成和编辑平台,提供多种AI视频处理、AI图像处理工具。

Clipfly 129
查看详情 Clipfly

客户端代码示例:

#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    int sock;
    struct sockaddr_un addr;
    const char *msg = "Hello from client";

    // 创建套接字
    sock = socket(AF_UNIX, SOCK_STREAM, 0);
    if (sock == -1) {
        perror("socket");
        exit(1);
    }

    addr.sun_family = AF_UNIX;
    snprintf(addr.sun_path, sizeof(addr.sun_path), "/tmp/my_socket");

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

    // 发送消息
    write(sock, msg, strlen(msg));

    close(sock);
    return 0;
}
登录后复制

编译与运行方法

将上述服务端保存为server.c,客户端保存为client.c,然后使用gcc编译:

gcc server.c -o server
gcc client.c -o client
登录后复制

启动服务端(在第一个终端中运行):

./server
登录后复制

再打开另一个终端,运行客户端:

./client
登录后复制

服务端应输出“收到消息: Hello from client”,表示通信成功。

注意事项与权限控制

  • Unix域套接字对应的路径(如/tmp/my_socket)需要有适当的读写权限,确保目标进程能访问。
  • 每次绑定前建议调用unlink()删除旧的套接字文件,避免“地址已被使用”错误。
  • 可以使用chmod修改套接字文件权限,或通过chown更改属主,实现访问控制。
  • 调试时可用ls /tmp/my_socket查看套接字文件(显示为srwxr-xr-x类型)。
基本上就这些。Unix域套接字是Linux本地通信的可靠选择,特别适合对性能和安全性有要求的场景。掌握基本的创建、绑定、连接和数据收发流程后,可以将其集成到实际项目中,比如后台服务与前端工具通信。

以上就是Linux如何使用Unix域套接字通信_Linux本地进程通信教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号