bump readme
This commit is contained in:
@@ -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
|
||||||
```
|
```
|
||||||
|
|||||||
+5
-5
@@ -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);
|
||||||
|
|||||||
+4
-4
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user