基于zmq RPC简单C++实现
simple-rpc
依赖
zmq
编译
mkdir build
cd build
cmake ..
make<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span>
复制
基本类型的序列化和反序列化
#include "serializer.h"
#include <iostream>
//自定义类型需要重载操作符>>和<<
struct foo {
int n;
std::string str;
foo() {}
foo(int a, std::string s)
: n(a), str(s) {}
friend Serializer& operator>>(Serializer& in, foo& f)
{
in >> f.n >> f.str;
return in;
}
friend Serializer& operator<<(Serializer& out, foo& f)
{
out << f.n << f.str;
return out;
}
};
// 测试原生类型的序列化和反序列化
void test1()
{
int a = 100;
std::string c = "hello";
Serializer sr;
sr << a; //序列化
sr << c;
int b = 0;
std::string d;
sr >> b; //反序列化
sr >> d;
std::cout << "b=" << b << ", d=" << d << std::endl;
}
//测试自定义类型的序列化和反序列化
void test2()
{
foo a(23, "evenleo");
Serializer sr;
sr << a;
foo b;
sr >> b;
std::cout << "b.n=" << b.n << ", b.str=" << b.str << std::endl;
}
int main(int argc, char** argv)
{
test1();
test2();
return 0;
}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span>
复制
输出结果:
b=100, d=hello
b.n=23, b.str=evenleo<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span>
复制
RPC
rpc_server
#include <string>
#include <iostream>
#include "rpc.h"
// 类成员函数
struct foo {
int add(int a, int b) { return a + b; }
};
// 普通函数
std::string Strcat(std::string s1, int n)
{
return s1 + std::to_string(n);
}
int main()
{
rpc server;
server.as_server(5555);
foo f;
server.regist("add", &foo::add, &f); //注册类成员函数
server.regist("Strcat", Strcat); //注册普通函数
server.run();
return 0;
}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span>
复制
rpc_client
#include <string>
#include <iostream>
#include "rpc.h"
int main()
{
rpc client;
client.as_client("127.0.0.1", 5555);
std::string str = client.call<std::string>("Strcat", "even", 24).value();
std::cout << "str=" << str << std::endl;
int result = client.call<int>("add", 3, 4).value();
std::cout << "result=" << result << std::endl;
return 0;
}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span>
复制
需要启动rpc_server,然后启动rpc_client,请求Strcat和add返回结果:
str=even24
result=7
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2023-02-19 Ubuntu rm -rf映射, 防止手误删除重要文件