bump readme

master
Сергей Маринкевич 2 months ago
parent 66c4e5190b
commit c6fed622ee

@ -20,11 +20,17 @@ project/
├── CMakeLists.txt ├── CMakeLists.txt
├── README.md ├── README.md
├── src ├── src
│   ├── client.cpp │   ├── client.cpp # пример клиента, использующего MyServiceProxy и IpcPipeChannel
│   ├── server.cpp # пример сервера, использующего MyServiceSkeleton и IpcPipeChannel
│   ├── MyService.cpp │   ├── MyService.cpp
│   ├── MyService.h │   ├── MyService.h
│   ├── rpc_export.h │   ├── rpc_export.h
│   └── server.cpp │   └── rpc
│   ├── IpcMessage.h # типизированное IPCсообщение (add<T>/get<T>)
│   ├── IpcPipeChannel.h# реализация RpcChannel поверх FIFO
│   ├── RpcChannel.h # абстрактный канал для RPC
│   ├── RpcClient.h # клиентское ядро RPC (call<Ret>(method, args...))
│   └── RpcInvoker.h # серверное ядро RPC (dispatch)
├── tools ├── tools
│ ├── generate_rpc.py │ ├── generate_rpc.py
│ └── templates │ └── templates
@ -37,6 +43,24 @@ project/
--- ---
## Архитектура (кратко)
* **Уровень IPC-сообщений**: `IpcMessage`
* Построение: `msg.add<std::string>("MyService.add"); msg.add<int>(7); msg.add<int>(8);`
* Разбор: `auto name = msg.get<std::string>(); auto a = msg.get<int>(); auto b = msg.get<int>();`
* Внутри хранится строка с простыми типовыми тегами (`i` для `int`, `s` для `std::string`), что позволяет в будущем перейти на бинарный формат без изменения API.
* **Уровень канала**: `RpcChannel` + `IpcPipeChannel`
* `RpcChannel` — абстракция: `send(const IpcMessage&)`, `receive() -> IpcMessage`.
* `IpcPipeChannel` — реализация поверх двух FIFO (`/tmp/fifo_to_server`, `/tmp/fifo_to_client`), которая внутри работает со строками, но наружу — только с `IpcMessage`.
* **Уровень RPC-ядра**:
* `RpcClient` — собирает `IpcMessage` из имени метода и аргументов, отправляет через `RpcChannel` и читает ответ.
* `RpcInvoker` — по имени метода (первое поле сообщения) находит зарегистрированную функцию-член и вызывает её, читая аргументы через `get<T>()`.
* **Сгенерированные обёртки**:
* `*.proxy.*` — используют `RpcClient` и `RpcChannel`, не зависят от конкретного транспорта.
* `*.skeleton.*` — используют `RpcInvoker` и принимают/возвращают `IpcMessage` для диспетчеризации вызовов.
---
## Зависимости ## Зависимости
* CMake ≥ 3.10 * CMake ≥ 3.10
@ -130,17 +154,21 @@ build/generated/
1. В одном терминале запускаем сервер: 1. В одном терминале запускаем сервер:
```bash ```bash
./server ./build/server
``` ```
Сервер создаёт (при необходимости) именованные пайпы `/tmp/fifo_to_server` и `/tmp/fifo_to_client`, читает запросы из `fifo_to_server` и пишет ответы в `fifo_to_client` через `IpcPipeChannel`.
2. В другом терминале — клиент: 2. В другом терминале — клиент:
```bash ```bash
./client ./build/client
``` ```
Клиент также открывает эти FIFO, но логически пишет в `fifo_to_server` и читает из `fifo_to_client` (через тот же `IpcPipeChannel`), а пользовательский код видит только вызов `MyServiceProxy`.
**Ожидаемый вывод:** **Ожидаемый вывод:**
``` ```text
RESULT: 15 RESULT: 15
``` ```

@ -7,13 +7,13 @@
int main() { int main() {
// Создание FIFO — часть пользовательского IPCкода. // Создание FIFO — часть пользовательского IPCкода.
mkfifo("/tmp/rpc_in", 0666); mkfifo("/tmp/fifo_to_server", 0666);
mkfifo("/tmp/rpc_out", 0666); mkfifo("/tmp/fifo_to_client", 0666);
// IPCуровень: канал поверх pipe. // IPCуровень: канал поверх pipe.
// Клиент пишет в fifo, который читает сервер (rpc_in), // Клиент пишет в fifo, который читает сервер (fifo_to_server),
// и читает из fifo, в который пишет сервер (rpc_out). // и читает из fifo, в который пишет сервер (fifo_to_client).
IpcPipeChannel ch("/tmp/rpc_out", "/tmp/rpc_in"); IpcPipeChannel ch("/tmp/fifo_to_client", "/tmp/fifo_to_server");
// RPCуровень: прокси поверх канала. // RPCуровень: прокси поверх канала.
MyServiceProxy proxy(ch); MyServiceProxy proxy(ch);

@ -7,12 +7,12 @@
int main() { int main() {
// Создание FIFO — часть пользовательского IPCкода. // Создание FIFO — часть пользовательского IPCкода.
mkfifo("/tmp/rpc_in", 0666); mkfifo("/tmp/fifo_to_server", 0666);
mkfifo("/tmp/rpc_out", 0666); mkfifo("/tmp/fifo_to_client", 0666);
// IPCуровень: канал поверх pipe. // IPCуровень: канал поверх pipe.
// Сервер читает из rpc_in и пишет в rpc_out. // Сервер читает из fifo_to_server и пишет в fifo_to_client.
IpcPipeChannel ch("/tmp/rpc_in", "/tmp/rpc_out"); IpcPipeChannel ch("/tmp/fifo_to_server", "/tmp/fifo_to_client");
// RPCуровень: скелет поверх того же канала. // RPCуровень: скелет поверх того же канала.
MyService realObj; MyService realObj;

Loading…
Cancel
Save