#ifndef TEST_RPC_RPCCLIENT_HEADER #define TEST_RPC_RPCCLIENT_HEADER #include "Socket.h" #include "CppDefine.h" #include "CommonStruct.h" #include "ParsePackage.h" typedef std::function& ret)> Call_back; class CInfoRouter; class CParsePackage; class CRPCClient { public: CRPCClient(); ~CRPCClient(); //start work void Start(short port, std::string ip); //set call back when rpc server response called; void SetCallBack(const std::string& func_name, Call_back& func); template bool CallFunc(const std::string& func_name, Args&&...args); public: void _DoRead(const cppnet::Handle& handle, base::CBuffer* data, uint32_t len, uint32_t err); void _DoWrite(const cppnet::Handle& handle, uint32_t len, uint32_t err); void _DoConnect(const cppnet::Handle& handle, uint32_t err); void _DoDisConnect(const cppnet::Handle& handle, uint32_t err); private: bool _connected; std::shared_ptr _info_router; std::shared_ptr _parse_package; std::string _ip; int _port; cppnet::Handle _socket; std::map _func_call_map; std::map _func_map; }; template bool CRPCClient::CallFunc(const std::string& func_name, Args&&...args) { if (!_func_map.count(func_name)) { return false; } if (!_func_call_map.count(func_name)) { return false; } if (!_connected) { return false; } std::vector vec; _parse_package->ParseParam(vec, std::forward(args)...); char buf[8192] = { 0 }; int len = 8192; if (!_parse_package->PackageFuncCall(buf, len, func_name, _func_map, vec)) { return false; } cppnet::Write(_socket, buf, len); return true; } #endif