From ee2fd0ee2e855d7e1b1ad2185e321c72b102d9aa Mon Sep 17 00:00:00 2001 From: GRayHook Date: Mon, 1 Dec 2025 18:32:12 +0700 Subject: [PATCH] base wo autocode --- .gitignore | 2 ++ CMakeLists.txt | 22 ++++++++++++++++++++++ src/MyService.cpp | 6 ++++++ src/MyService.h | 8 ++++++++ src/MyService.proxy.cpp | 23 +++++++++++++++++++++++ src/MyService.proxy.h | 14 ++++++++++++++ src/MyService.skeleton.cpp | 20 ++++++++++++++++++++ src/MyService.skeleton.h | 15 +++++++++++++++ src/client.cpp | 10 ++++++++++ src/server.cpp | 32 ++++++++++++++++++++++++++++++++ 10 files changed, 152 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 src/MyService.cpp create mode 100644 src/MyService.h create mode 100644 src/MyService.proxy.cpp create mode 100644 src/MyService.proxy.h create mode 100644 src/MyService.skeleton.cpp create mode 100644 src/MyService.skeleton.h create mode 100644 src/client.cpp create mode 100644 src/server.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3cca2b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.swp +build/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..b0951d2 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.10) + +project(SimpleRPCExample CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Папка с исходниками +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src) + +# Сервер +add_executable(server + src/server.cpp + src/MyService.cpp + src/MyService.skeleton.cpp +) + +# Клиент +add_executable(client + src/client.cpp + src/MyService.proxy.cpp +) diff --git a/src/MyService.cpp b/src/MyService.cpp new file mode 100644 index 0000000..f9d62e0 --- /dev/null +++ b/src/MyService.cpp @@ -0,0 +1,6 @@ +// MyService.cpp +#include "MyService.h" + +int MyService::add(int a, int b) { + return a + b; +} diff --git a/src/MyService.h b/src/MyService.h new file mode 100644 index 0000000..a4af91a --- /dev/null +++ b/src/MyService.h @@ -0,0 +1,8 @@ +// MyService.h +#pragma once + +class [[annotate("export")]] MyService { +public: + [[annotate("export")]] + int add(int a, int b); +}; diff --git a/src/MyService.proxy.cpp b/src/MyService.proxy.cpp new file mode 100644 index 0000000..28c93ee --- /dev/null +++ b/src/MyService.proxy.cpp @@ -0,0 +1,23 @@ +// MyService.proxy.cpp +#include "MyService.proxy.h" +#include +#include +#include + +MyServiceProxy::MyServiceProxy(const char* pipeIn, const char* pipeOut) { + fdIn = open(pipeIn, O_WRONLY); + fdOut = open(pipeOut, O_RDONLY); +} + +int MyServiceProxy::add(int a, int b) { + std::ostringstream out; + out << "add " << a << " " << b << "\n"; + + write(fdIn, out.str().c_str(), out.str().size()); + + char buf[128]; + int n = read(fdOut, buf, sizeof(buf)-1); + buf[n] = 0; + + return std::atoi(buf); +} diff --git a/src/MyService.proxy.h b/src/MyService.proxy.h new file mode 100644 index 0000000..7e04b96 --- /dev/null +++ b/src/MyService.proxy.h @@ -0,0 +1,14 @@ +// MyService.proxy.h +#pragma once +#include + +class MyServiceProxy { +public: + MyServiceProxy(const char* pipeIn, const char* pipeOut); + + int add(int a, int b); + +private: + int fdIn; // клиент пишет сюда → сервер читает + int fdOut; // сервер пишет сюда → клиент читает +}; diff --git a/src/MyService.skeleton.cpp b/src/MyService.skeleton.cpp new file mode 100644 index 0000000..b90ccea --- /dev/null +++ b/src/MyService.skeleton.cpp @@ -0,0 +1,20 @@ +// MyService.skeleton.cpp +#include "MyService.skeleton.h" +#include + +MyServiceSkeleton::MyServiceSkeleton(MyService& o) : obj(o) {} + +std::string MyServiceSkeleton::handleRequest(const std::string& req) { + std::istringstream in(req); + std::string method; + in >> method; + + if (method == "add") { + int a, b; + in >> a >> b; + int r = obj.add(a, b); + return std::to_string(r); + } + + return "ERR"; +} diff --git a/src/MyService.skeleton.h b/src/MyService.skeleton.h new file mode 100644 index 0000000..38ca0c8 --- /dev/null +++ b/src/MyService.skeleton.h @@ -0,0 +1,15 @@ +// MyService.skeleton.h +#pragma once +#include "MyService.h" +#include + +class MyServiceSkeleton { +public: + MyServiceSkeleton(MyService& obj); + + // обработка одной строки запроса и возврат ответа + std::string handleRequest(const std::string& req); + +private: + MyService& obj; +}; diff --git a/src/client.cpp b/src/client.cpp new file mode 100644 index 0000000..a87bece --- /dev/null +++ b/src/client.cpp @@ -0,0 +1,10 @@ +// client.cpp +#include "MyService.proxy.h" +#include + +int main() { + MyServiceProxy proxy("/tmp/rpc_in", "/tmp/rpc_out"); + + int r = proxy.add(7, 8); + std::cout << "RESULT: " << r << std::endl; +} diff --git a/src/server.cpp b/src/server.cpp new file mode 100644 index 0000000..5dc9d1d --- /dev/null +++ b/src/server.cpp @@ -0,0 +1,32 @@ +// server.cpp +#include "MyService.h" +#include "MyService.skeleton.h" + +#include +#include +#include +#include + +int main() { + mkfifo("/tmp/rpc_in", 0666); + mkfifo("/tmp/rpc_out", 0666); + + int fdIn = open("/tmp/rpc_in", O_RDONLY); + int fdOut = open("/tmp/rpc_out", O_WRONLY); + + MyService realObj; + MyServiceSkeleton skeleton(realObj); + + char buf[256]; + + while (true) { + int n = read(fdIn, buf, sizeof(buf)-1); + if (n <= 0) break; + + buf[n] = 0; + std::string req(buf); + std::string resp = skeleton.handleRequest(req); + + write(fdOut, resp.c_str(), resp.size()); + } +}