# 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环境下,使用以下命令编译项目: ```bash # 创建构建目录 mkdir build && cd build # 运行CMake配置 cmake .. # 编译项目 make # 安装(可选) make install ``` ### Windows 平台 1. 确保已安装 CMake(3.10 或更高版本)和 Visual Studio 2017 或更高版本 2. 使用提供的构建脚本(以管理员身份运行命令提示符): ```batch build_windows.bat ``` 3. 构建完成后,可执行文件将位于 `install\bin\` 目录下 或者手动构建: ```batch 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平台上,运行示例的方式相同: 1. 首先启动服务器: ```bash cd install/bin ./rpc_server # Linux rpc_server.exe # Windows ``` 2. 在另一个终端启动客户端: ```bash cd install/bin ./rpc_client # Linux rpc_client.exe # Windows ``` 3. 客户端将连接到服务器并执行两个示例操作: - 调用远程加法函数 `add(10, 20)` - 调用远程函数获取服务器信息 `get_server_info()` 4. 查看终端输出以确认操作是否成功完成 ## 使用示例 ### 启动服务器 ```bash ./bin/rpc_server ``` 服务器将在8080端口上监听客户端连接。 ### 运行客户端 ```bash ./bin/rpc_client ``` 客户端将连接到服务器并调用两个示例函数: - `add(10, 20)` - 远程加法运算 - `get_server_info()` - 获取服务器信息 ## 自定义扩展 ### 注册新的远程函数 要在服务器端添加新的远程函数,您需要: 1. 实现函数处理器 2. 使用`rpc_register_function`注册函数 示例: ```c // 函数实现 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); ``` ### 客户端调用新函数 在客户端调用新注册的函数: ```c 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); ``` ## 注意事项 - 本项目是一个教学示例,可能不适合在生产环境中使用 - 当前实现中,字符串参数和返回值的处理使用了简单的内存管理策略,在实际应用中可能需要更复杂的处理 - 错误处理机制相对简单,实际应用中可能需要更完善的错误处理