From 0c647ec97c327d5d42733e47241d0c4929d04909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=91=D0=BE=D1=80=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Mon, 27 Apr 2026 13:57:49 +0200 Subject: [PATCH] working commit --- .gitignore | 3 ++ Makefile | 3 +- Makefile.am | 1 + Makefile.in | 3 +- service.cpp | 62 +------------------------------ service.hpp | 3 +- service_test.cpp | 96 +++++++++++++++++++++++++++++++++++++++++++++++- 7 files changed, 106 insertions(+), 65 deletions(-) diff --git a/.gitignore b/.gitignore index 4450c40..b7765f0 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ Makefile autom4te.cache stamp-h1 defines.h +*.o +*.bin +*.tar* diff --git a/Makefile b/Makefile index 8632856..083d35c 100644 --- a/Makefile +++ b/Makefile @@ -122,7 +122,7 @@ rpcclient_test_OBJECTS = $(am_rpcclient_test_OBJECTS) rpcclient_test_LDADD = $(LDADD) am_service_test_OBJECTS = service_test.$(OBJEXT) tunclient.$(OBJEXT) \ service.$(OBJEXT) interface.$(OBJEXT) rpcheader.$(OBJEXT) \ - logger.$(OBJEXT) control.pb.$(OBJEXT) + logger.$(OBJEXT) nethandler.$(OBJEXT) control.pb.$(OBJEXT) service_test_OBJECTS = $(am_service_test_OBJECTS) service_test_LDADD = $(LDADD) am_tcpclient_test_OBJECTS = resolver.$(OBJEXT) netclient.$(OBJEXT) \ @@ -360,6 +360,7 @@ service_test_SOURCES = service_test.cpp \ interface.cpp interface.hpp \ rpcheader.cpp rpcheader.hpp \ logger.cpp logger.hpp \ + nethandler.cpp nethandler.hpp \ control.pb.cc control.pb.h udpclient_test_SOURCES = \ diff --git a/Makefile.am b/Makefile.am index 996e2d5..468c325 100644 --- a/Makefile.am +++ b/Makefile.am @@ -39,6 +39,7 @@ service_test_SOURCES = service_test.cpp \ interface.cpp interface.hpp \ rpcheader.cpp rpcheader.hpp \ logger.cpp logger.hpp \ + nethandler.cpp nethandler.hpp \ control.pb.cc control.pb.h udpclient_test_SOURCES = \ diff --git a/Makefile.in b/Makefile.in index 339996f..9f4cdb6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -122,7 +122,7 @@ rpcclient_test_OBJECTS = $(am_rpcclient_test_OBJECTS) rpcclient_test_LDADD = $(LDADD) am_service_test_OBJECTS = service_test.$(OBJEXT) tunclient.$(OBJEXT) \ service.$(OBJEXT) interface.$(OBJEXT) rpcheader.$(OBJEXT) \ - logger.$(OBJEXT) control.pb.$(OBJEXT) + logger.$(OBJEXT) nethandler.$(OBJEXT) control.pb.$(OBJEXT) service_test_OBJECTS = $(am_service_test_OBJECTS) service_test_LDADD = $(LDADD) am_tcpclient_test_OBJECTS = resolver.$(OBJEXT) netclient.$(OBJEXT) \ @@ -360,6 +360,7 @@ service_test_SOURCES = service_test.cpp \ interface.cpp interface.hpp \ rpcheader.cpp rpcheader.hpp \ logger.cpp logger.hpp \ + nethandler.cpp nethandler.hpp \ control.pb.cc control.pb.h udpclient_test_SOURCES = \ diff --git a/service.cpp b/service.cpp index 5866cef..31a35c5 100644 --- a/service.cpp +++ b/service.cpp @@ -20,66 +20,8 @@ extern "C" { using namespace std::chrono_literals; -void SocketHandler::Handle(int sock) { - std::cout << std::format("Handler {} start", sock) << std::endl; - - const int headerSize = 8; - std::string rawResHeader; - - char buffer[headerSize]; - memset(&buffer, 0, headerSize); - int rsize = 0; - - if ((rsize = read(sock, &buffer, headerSize)) < 0) { - logger.Log("Error read"); - close(sock); - return; - } - logger.Log(std::format("rpc rsize {}", rsize)); - - RPCHeader inRPCHeader; - std::string i(buffer, headerSize); - inRPCHeader.Decode(i); - int rcpPacketSize = inRPCHeader.PacketSize(); - logger.Log(std::format("rpc packet size {}", rcpPacketSize)); - - char buffer2[rcpPacketSize]; - - if ((rsize = read(sock, &buffer2, rcpPacketSize)) < 0) { - logger.Log("Error read"); - close(sock); - return; - } - logger.Log(std::format("rpc packet rsize {}", rsize)); - - std::string rawReq(buffer2, rcpPacketSize); - - control::HelloRequest pbReq; - pbReq.ParseFromString(rawReq); - logger.Log(std::format("rpcName: {}", pbReq.meta().rpcname())); - logger.Log(std::format("req message: {}\n", pbReq.message())); - - control::HelloResult pbRes; - pbRes.set_message("Johnny!"); - auto resMeta = pbRes.mutable_meta(); - resMeta->set_error(false); - std::string rawRes; - pbRes.SerializeToString(&rawRes); - - RPCHeader outRPCHeader(rawRes.size()); - auto rawPacket = outRPCHeader.Encode(); - rawPacket.append(rawRes); - - int wsize = 0; - if ((wsize = write(sock, rawPacket.data(), rawPacket.size())) < 0) { - logger.Log("Error write"); - close(sock); - return; - } - - logger.Log(std::format("Handler {} done", sock)); - close(sock); -} +void SocketHandler::Handle(int sock) {}; +SocketHandler::~SocketHandler(void) {}; Service::Service(int svcport) { port = svcport; diff --git a/service.hpp b/service.hpp index c0ab945..07b8221 100644 --- a/service.hpp +++ b/service.hpp @@ -7,7 +7,8 @@ class SocketHandler { public: - void Handle(int sock); + virtual void Handle(int sock); + virtual ~SocketHandler(void); }; class Service { diff --git a/service_test.cpp b/service_test.cpp index 7e53a39..1853d4c 100644 --- a/service_test.cpp +++ b/service_test.cpp @@ -5,7 +5,97 @@ #include #include +#include + +#include +#include #include +#include +#include + + +class TestRPCHandler : public NetHandler { +public: + std::expected Handle(std::string& req, std::string& res) override; +}; + +std::expected TestRPCHandler::Handle(std::string& rawReq, std::string& rawRes) { + control::HelloRequest pbReq; + pbReq.ParseFromString(rawReq); + logger.Log(std::format("rpcName: {}", pbReq.meta().rpcname())); + logger.Log(std::format("req message: {}", pbReq.message())); + + control::HelloResult pbRes; + pbRes.set_message("Johnny!"); + logger.Log(std::format("res message: {}", pbRes.message())); + + auto resMeta = pbRes.mutable_meta(); + resMeta->set_error(false); + pbRes.SerializeToString(&rawRes); + return {}; +} + + + +class TestSocketHandler : public SocketHandler { +private: + NetHandler* nextHandler; +public: + TestSocketHandler(NetHandler& rcpHandler); + virtual void Handle(int sock) override; + virtual ~TestSocketHandler(void) override; +}; + +TestSocketHandler::TestSocketHandler(NetHandler& rpcHandler) { + nextHandler = &rpcHandler; +} + +TestSocketHandler::~TestSocketHandler(void) {}; + + +void TestSocketHandler::Handle(int sock) { + logger.Log(std::format("Handler {} start", sock)); + + const int headerSize = 8; + std::string inRawHeader(headerSize, '\0'); + int rsize = 0; + if ((rsize = read(sock, inRawHeader.data(), inRawHeader.size())) < 0) { + logger.Log("Error read"); + close(sock); + return; + } + logger.Log(std::format("header read size {}", rsize)); + + RPCHeader inHeader; + inHeader.Decode(inRawHeader); + int inPacketSize = inHeader.PacketSize(); + logger.Log(std::format("rpc packet size {}", inPacketSize)); + + std::string inRawRequest(inPacketSize, '\0'); + if ((rsize = read(sock, inRawRequest.data(), inRawRequest.size())) < 0) { + logger.Log("Error read"); + close(sock); + return; + } + logger.Log(std::format("rpc packet rsize {}", rsize)); + + std::string outRawResult; + nextHandler->Handle(inRawRequest, outRawResult); + + RPCHeader outHeader(outRawResult.size()); + auto rawPacket = outHeader.Encode(); + rawPacket.append(outRawResult); + + int wsize = 0; + if ((wsize = write(sock, rawPacket.data(), rawPacket.size())) < 0) { + logger.Log("Error write"); + close(sock); + return; + } + + logger.Log(std::format("Handler {} done", sock)); + close(sock); +} int main(int argc, char** argv) { Service svc(1025); @@ -14,8 +104,10 @@ int main(int argc, char** argv) { std::cerr << bindres.error() << std::endl; return 1; } - SocketHandler handler; - auto listres = svc.Listen(&handler); + + TestRPCHandler rcpHandler; + TestSocketHandler socketHandler(rcpHandler); + auto listres = svc.Listen(&socketHandler); if (!listres) { std::cerr << listres.error() << std::endl; return 1;