# IPC **Repository Path**: amphetaminewei/ipc ## Basic Information - **Project Name**: IPC - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-03-23 - **Last Updated**: 2026-03-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IPC — 点对点 D-Bus 示例 基于 **D-Bus** 的点对点 IPC 示例:C++ 客户端(gdbus)通过 Unix socket 连接 Python 服务端(PyGObject/GIO),不经过系统 `dbus-daemon`。包含普通 RPC 与**流式返回**(通过信号)两种用法。 ## 项目结构 ``` ipc/ ├── client.cpp # C++ 客户端(gdbus) ├── server.py # Python 服务端(PyGObject / GIO) ├── com.example.MyService.xml # D-Bus 接口定义(用于 gdbus-codegen) ├── myservice.c / myservice.h # 由 gdbus-codegen 生成的 C 胶水代码 ├── CMakeLists.txt # 客户端构建 └── README.md ``` ## 依赖 - **C++ 客户端**:GLib / GIO(`libgio-2.0`),CMake ≥ 3.10,C++17 - **Python 服务端**:Python 3,PyGObject(Gio 2.0) Ubuntu / Debian 示例: ```bash # 客户端 sudo apt install build-essential cmake pkg-config libglib2.0-dev libgio2.0-dev # 服务端 sudo apt install python3-gi python3-gi-cairo ``` ## 构建客户端 ```bash cd ipc mkdir build && cd build cmake .. make ``` 生成可执行文件 `client`。 ## 接口说明 服务端提供接口 `com.example.MyService`,对象路径 `/com/example/MyService`: | 方法 / 信号 | 说明 | |-------------|------| | `Hello(name: s) → (response: s)` | 回显问候 | | `Add(a: i, b: i) → (result: i)` | 两数相加 | | `GetInfo() → (name, version, language: s)` | 返回服务信息 | | `StartStream(num_chunks: u) → (total_sent: u)` | 流式请求:服务端按帧发 `StreamChunk` 信号,发完后返回总帧数 | | 信号 `StreamChunk(index: u, chunk_data: s)` | 流式数据帧,由 `StartStream` 触发 | 流式流程:客户端调用 `StartStream(n)` 并订阅 `StreamChunk`;服务端连续发送 n 次 `StreamChunk` 信号,最后一帧发完后在 `StartStream` 上 `return_value`。 ## 使用说明 1. **先启动服务端**(在项目根目录或 `ipc` 目录下): ```bash python3 server.py ``` 服务监听 `unix:abstract=/tmp/my-dbus-service.sock`,看到“等待客户端连接...”即就绪。 2. **再运行客户端**: ```bash ./build/client ``` 客户端会连接同一 socket,执行 Hello / Add / GetInfo 以及流式调用 `StartStream` 的示例。 ## 重新生成胶水代码 若修改了 `com.example.MyService.xml`,需重新生成 `myservice.c` / `myservice.h`: ```bash gdbus-codegen --interface-prefix com.example. --generate-c-code myservice com.example.MyService.xml ``` 然后将生成的 `myservice.c`、`myservice.h` 放回本目录,并重新构建客户端。 ## 技术说明 - **点对点**:客户端与服务端直连 Unix socket,不依赖系统或会话总线。 - **协议一致**:C 端使用 GIO 的 gdbus API,Python 端使用 Gio(同一套 D-Bus 实现),接口由 XML 定义并保持一致。 - **流式实现**:通过 D-Bus 信号 `StreamChunk` 分帧推送,方法 `StartStream` 在最后一帧发送完成后通过 `return_value` 返回,便于客户端确认结束。 ## 许可证 与所使用 GLib/GIO 许可保持一致(通常为 LGPL)。本示例代码可自由用于学习与二次开发。