You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
2 months ago | |
|---|---|---|
| .. | ||
| include | 2 months ago | |
| src | 2 months ago | |
| .gitignore | 2 months ago | |
| CMakeLists.txt | 2 months ago | |
| README.md | 2 months ago | |
| build.sh | 2 months ago | |
| build_windows.bat | 2 months ago | |
| test_cmake_config.cmd | 2 months ago | |
| test_compile.cmd | 2 months ago | |
README.md
RPC Demo Project
这是一个用C语言实现的简单RPC(Remote Procedure Call)框架,可以在Linux环境下运行。这个框架允许客户端程序远程调用服务器上的函数,就像调用本地函数一样。
项目结构
├── include/ # 头文件目录
│ ├── rpc_common.h # 公共定义和工具函数
│ ├── rpc_transport.h # 网络传输层接口
│ └── rpc_message.h # 消息序列化和反序列化
├── src/ # 源代码目录
│ ├── rpc_common.c # 公共函数实现
│ ├── rpc_transport.c # 传输层实现
│ ├── rpc_message.c # 消息处理实现
│ ├── rpc_server.c # RPC服务器实现
│ ├── rpc_client.c # RPC客户端实现
│ └── CMakeLists.txt # 源代码CMake配置
├── cmake/ # CMake模块目录
├── CMakeLists.txt # 主CMake配置文件
└── README.md # 项目说明文档
功能特性
- 支持基本数据类型的远程函数调用(int、float、double、string、bool、void)
- 支持多参数和返回值
- 基于TCP/IP协议的网络通信
- 多线程服务器设计,支持并发请求
- 使用CMake构建系统
编译和构建
Linux 平台
在Linux环境下,使用以下命令编译项目:
# 创建构建目录
mkdir build && cd build
# 运行CMake配置
cmake ..
# 编译项目
make
# 安装(可选)
make install
Windows 平台
- 确保已安装 CMake(3.10 或更高版本)和 Visual Studio 2017 或更高版本
- 使用提供的构建脚本(以管理员身份运行命令提示符):
build_windows.bat
- 构建完成后,可执行文件将位于
install\bin\目录下
或者手动构建:
mkdir build_windows
cd build_windows
cmake .. -G "Visual Studio 17 2022" -DCMAKE_INSTALL_PREFIX=..\install
cmake --build . --config Release
cmake --build . --config Release --target install
运行示例
无论是在Linux还是Windows平台上,运行示例的方式相同:
-
首先启动服务器:
cd install/bin ./rpc_server # Linux rpc_server.exe # Windows -
在另一个终端启动客户端:
cd install/bin ./rpc_client # Linux rpc_client.exe # Windows -
客户端将连接到服务器并执行两个示例操作:
- 调用远程加法函数
add(10, 20) - 调用远程函数获取服务器信息
get_server_info()
- 调用远程加法函数
-
查看终端输出以确认操作是否成功完成
使用示例
启动服务器
./bin/rpc_server
服务器将在8080端口上监听客户端连接。
运行客户端
./bin/rpc_client
客户端将连接到服务器并调用两个示例函数:
add(10, 20)- 远程加法运算get_server_info()- 获取服务器信息
自定义扩展
注册新的远程函数
要在服务器端添加新的远程函数,您需要:
- 实现函数处理器
- 使用
rpc_register_function注册函数
示例:
// 函数实现
example_handler(rpc_param_t* params, int args_count, rpc_param_t* return_value) {
// 函数逻辑
return RPC_SUCCESS;
}
// 注册函数
rpc_param_type_t example_params[] = {RPC_TYPE_INT, RPC_TYPE_STRING};
rpc_register_function("example_func", example_handler, RPC_TYPE_STRING, example_params, 2);
客户端调用新函数
在客户端调用新注册的函数:
rpc_param_t params[2];
rpc_param_t return_value;
// 设置参数
rpc_init_param(¶ms[0], RPC_TYPE_INT);
params[0].value.int_val = 123;
rpc_init_param(¶ms[1], RPC_TYPE_STRING);
params[1].value.string_val = "example string";
// 设置返回值
rpc_init_param(&return_value, RPC_TYPE_STRING);
// 调用远程函数
int ret = rpc_call(client, "example_func", params, 2, &return_value);
注意事项
- 本项目是一个教学示例,可能不适合在生产环境中使用
- 当前实现中,字符串参数和返回值的处理使用了简单的内存管理策略,在实际应用中可能需要更复杂的处理
- 错误处理机制相对简单,实际应用中可能需要更完善的错误处理