bump readme
This commit is contained in:
@@ -20,11 +20,17 @@ project/
|
||||
├── CMakeLists.txt
|
||||
├── README.md
|
||||
├── src
|
||||
│ ├── client.cpp
|
||||
│ ├── client.cpp # пример клиента, использующего MyServiceProxy и IpcPipeChannel
|
||||
│ ├── server.cpp # пример сервера, использующего MyServiceSkeleton и IpcPipeChannel
|
||||
│ ├── MyService.cpp
|
||||
│ ├── MyService.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
|
||||
│ ├── generate_rpc.py
|
||||
│ └── 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
|
||||
@@ -130,17 +154,21 @@ build/generated/
|
||||
1. В одном терминале запускаем сервер:
|
||||
|
||||
```bash
|
||||
./server
|
||||
./build/server
|
||||
```
|
||||
|
||||
Сервер создаёт (при необходимости) именованные пайпы `/tmp/fifo_to_server` и `/tmp/fifo_to_client`, читает запросы из `fifo_to_server` и пишет ответы в `fifo_to_client` через `IpcPipeChannel`.
|
||||
|
||||
2. В другом терминале — клиент:
|
||||
|
||||
```bash
|
||||
./client
|
||||
./build/client
|
||||
```
|
||||
|
||||
Клиент также открывает эти FIFO, но логически пишет в `fifo_to_server` и читает из `fifo_to_client` (через тот же `IpcPipeChannel`), а пользовательский код видит только вызов `MyServiceProxy`.
|
||||
|
||||
**Ожидаемый вывод:**
|
||||
|
||||
```
|
||||
```text
|
||||
RESULT: 15
|
||||
```
|
||||
|
||||
+5
-5
@@ -7,13 +7,13 @@
|
||||
|
||||
int main() {
|
||||
// Создание FIFO — часть пользовательского IPC‑кода.
|
||||
mkfifo("/tmp/rpc_in", 0666);
|
||||
mkfifo("/tmp/rpc_out", 0666);
|
||||
mkfifo("/tmp/fifo_to_server", 0666);
|
||||
mkfifo("/tmp/fifo_to_client", 0666);
|
||||
|
||||
// IPC‑уровень: канал поверх pipe.
|
||||
// Клиент пишет в fifo, который читает сервер (rpc_in),
|
||||
// и читает из fifo, в который пишет сервер (rpc_out).
|
||||
IpcPipeChannel ch("/tmp/rpc_out", "/tmp/rpc_in");
|
||||
// Клиент пишет в fifo, который читает сервер (fifo_to_server),
|
||||
// и читает из fifo, в который пишет сервер (fifo_to_client).
|
||||
IpcPipeChannel ch("/tmp/fifo_to_client", "/tmp/fifo_to_server");
|
||||
|
||||
// RPC‑уровень: прокси поверх канала.
|
||||
MyServiceProxy proxy(ch);
|
||||
|
||||
+4
-4
@@ -7,12 +7,12 @@
|
||||
|
||||
int main() {
|
||||
// Создание FIFO — часть пользовательского IPC‑кода.
|
||||
mkfifo("/tmp/rpc_in", 0666);
|
||||
mkfifo("/tmp/rpc_out", 0666);
|
||||
mkfifo("/tmp/fifo_to_server", 0666);
|
||||
mkfifo("/tmp/fifo_to_client", 0666);
|
||||
|
||||
// IPC‑уровень: канал поверх pipe.
|
||||
// Сервер читает из rpc_in и пишет в rpc_out.
|
||||
IpcPipeChannel ch("/tmp/rpc_in", "/tmp/rpc_out");
|
||||
// Сервер читает из fifo_to_server и пишет в fifo_to_client.
|
||||
IpcPipeChannel ch("/tmp/fifo_to_server", "/tmp/fifo_to_client");
|
||||
|
||||
// RPC‑уровень: скелет поверх того же канала.
|
||||
MyService realObj;
|
||||
|
||||
Reference in New Issue
Block a user