在Linux下通过Socket实现本机进程间通信

简介: 这些代码块提供了一个基本的IPC通信模型,可以用作更复杂应用程序的基础。要根据特定需求扩展这些代码,您可能需要考虑错误处理、多线程或多进程并发处理、以及消息编码策略。

在Linux环境下实现本机进程间通信(IPC),socket是一种灵活的通信方式。Socket允许在同一台机器上的进程或不同机器间的进程通信。此处我们专注于本机进程间通信。

本机进程间通信通常使用UNIX Domain Sockets,该方式相比网络套接字提供了更高的数据传输效率和安全性,因为它不会将数据通过网络接口发送。

以下是使用C语言在Linux操作系统上通过UNIX Domain Sockets进行进程间通信的示例代码。这个示例将包括一个服务器进程和一个客户端进程。

服务器端:

  1. 创建一个套接字: 使用 socket()函数,指定 AF_UNIX作为协议族。
  2. 绑定套接字: 使用 bind()函数将套接字绑定到文件系统中的名称(地址)。
  3. 监听连接: 使用 listen()函数使服务器套接字监听连接。
  4. 接受连接: 使用 accept()函数等待客户端的连接请求。
  5. 读写数据: 使用 read()write()函数与客户端交换数据。
  6. 关闭连接: 使用 close()函数结束连接。
// Server code
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    int server_sock, client_sock, len;
    struct sockaddr_un server_addr;
    char buf[100];

    // 创建套接字
    server_sock = socket(AF_UNIX, SOCK_STREAM, 0);
    server_addr.sun_family = AF_UNIX;
    strcpy(server_addr.sun_path, "socketfile");

    // 绑定
    bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr));

    // 监听
    listen(server_sock, 5);

    // 接受连接
    client_sock = accept(server_sock, NULL, NULL);

    // 从client读取数据
    read(client_sock, buf, sizeof(buf));

    // 这里可以处理数据

    // 向client写入数据
    write(client_sock, buf, sizeof(buf));

    // 关闭套接字
    close(client_sock);
    close(server_sock);

    // 删除socket文件
    unlink(server_addr.sun_path);

    return 0;
}
​

客户端:

  1. 创建一个套接字: 使用 socket()函数.
  2. 连接到服务器: 使用 connect()函数连接到服务器。
  3. 读写数据: 使用 write()read()函数与服务器交换数据。
  4. 关闭套接字: 使用 close()函数。
// Client code
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    int client_sock;
    struct sockaddr_un server_addr;
    char buf[100];

    // 创建套接字
    client_sock = socket(AF_UNIX, SOCK_STREAM, 0);

    // 指定服务器地址
    server_addr.sun_family = AF_UNIX;
    strcpy(server_addr.sun_path, "socketfile");

    // 连接到服务器
    connect(client_sock, (struct sockaddr *)&server_addr, sizeof(server_addr));

    // 向服务器发送数据
    write(client_sock, "Hello, World!", 13);

    // 读取服务器响应
    read(client_sock, buf, sizeof(buf));

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

    return 0;
}
​

步骤:

  1. 编译代码: 使用 gcc -o server server.cgcc -o client client.c来编译上述两个C文件。
  2. 运行服务器: 在一个终端窗口中运行编译好的服务器程序。
  3. 运行客户端: 在另一个终端窗口中运行客户端程序,这时它会发送消息给服务器,并收到回复。

这些代码块提供了一个基本的IPC通信模型,可以用作更复杂应用程序的基础。要根据特定需求扩展这些代码,您可能需要考虑错误处理、多线程或多进程并发处理、以及消息编码策略。

目录
相关文章
|
Ubuntu 开发工具 计算机视觉
RK3588 RGA 图像操作
RK3588 RGA 图像操作
|
10月前
|
敏捷开发 测试技术 API
测试金字塔:构建高效自动化测试策略的基石
测试金字塔:构建高效自动化测试策略的基石
692 116
|
8月前
|
安全 Linux iOS开发
Nessus Professional 10.11 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序 (2025 年 12 月更新)
Nessus Professional 10.11 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序 (2025 年 12 月更新)
174 5
Nessus Professional 10.11 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序 (2025 年 12 月更新)
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
1146 6
|
网络协议 Linux
linux学习之套接字通信
Linux中的套接字通信是网络编程的核心,允许多个进程通过网络交换数据。套接字提供跨网络通信能力,涵盖本地进程间通信及远程通信。主要基于TCP和UDP两种模型:TCP面向连接且可靠,适用于文件传输等高可靠性需求;UDP无连接且速度快,适合实时音视频通信等低延迟场景。通过创建、绑定、监听及读写操作,可以在Linux环境下轻松实现这两种通信模型。
513 1
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
794 1
|
网络协议 Unix
`AF_UNIX` 和 `AF_LOCAL`
`AF_UNIX` 和 `AF_LOCAL`
1424 1
|
Ubuntu 数据安全/隐私保护
Ubuntu22.04LTS环境部署实战
这篇文章提供了Ubuntu 22.04 LTS操作系统的详细安装步骤,包括选择语言、键盘布局、网络配置、软件源设置、磁盘分区、安装OpenSSH服务以及完成安装和首次登录系统的过程。
9742 6
Ubuntu22.04LTS环境部署实战
|
机器学习/深度学习 域名解析 缓存
详尽分享用C语言实现DNS
详尽分享用C语言实现DNS
453 0
|
Ubuntu 安全 网络协议

热门文章

最新文章