2 changed files with 239 additions and 0 deletions
@ -0,0 +1,119 @@ |
|||||
|
# 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环境下,使用以下命令编译项目: |
||||
|
|
||||
|
```bash |
||||
|
# 创建构建目录 |
||||
|
mkdir build && cd build |
||||
|
|
||||
|
# 运行CMake配置 |
||||
|
cmake .. |
||||
|
|
||||
|
# 编译项目 |
||||
|
make |
||||
|
|
||||
|
# 安装(可选) |
||||
|
make install |
||||
|
``` |
||||
|
|
||||
|
## 使用示例 |
||||
|
|
||||
|
### 启动服务器 |
||||
|
|
||||
|
```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); |
||||
|
``` |
||||
|
|
||||
|
## 注意事项 |
||||
|
|
||||
|
- 本项目是一个教学示例,可能不适合在生产环境中使用 |
||||
|
- 当前实现中,字符串参数和返回值的处理使用了简单的内存管理策略,在实际应用中可能需要更复杂的处理 |
||||
|
- 错误处理机制相对简单,实际应用中可能需要更完善的错误处理 |
||||
@ -0,0 +1,120 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
# RPC项目构建脚本 |
||||
|
|
||||
|
# 设置默认构建目录 |
||||
|
build_dir="build" |
||||
|
install_prefix="/usr/local" |
||||
|
|
||||
|
# 显示帮助信息 |
||||
|
show_help() { |
||||
|
echo "用法: $0 [选项]" |
||||
|
echo "选项:" |
||||
|
echo " --help 显示帮助信息" |
||||
|
echo " --clean 清理构建目录" |
||||
|
echo " --install 安装到系统目录" |
||||
|
echo " --prefix=DIR 设置安装前缀 (默认: /usr/local)" |
||||
|
echo " --build-dir=DIR 设置构建目录 (默认: build)" |
||||
|
} |
||||
|
|
||||
|
# 处理命令行参数 |
||||
|
for arg in "$@"; |
||||
|
do |
||||
|
case $arg in |
||||
|
--help) |
||||
|
show_help |
||||
|
exit 0 |
||||
|
;; |
||||
|
--clean) |
||||
|
echo "清理构建目录 $build_dir..." |
||||
|
rm -rf "$build_dir" |
||||
|
exit 0 |
||||
|
;; |
||||
|
--install) |
||||
|
install=true |
||||
|
shift |
||||
|
;; |
||||
|
--prefix=*) |
||||
|
install_prefix="${arg#*=}" |
||||
|
shift |
||||
|
;; |
||||
|
--build-dir=*) |
||||
|
build_dir="${arg#*=}" |
||||
|
shift |
||||
|
;; |
||||
|
*) |
||||
|
echo "未知选项: $arg" |
||||
|
show_help |
||||
|
exit 1 |
||||
|
;; |
||||
|
esac |
||||
|
done |
||||
|
|
||||
|
# 检查是否在Linux环境下运行 |
||||
|
if [[ "$(uname)" != "Linux" ]]; then |
||||
|
echo "警告: 这个脚本设计用于Linux环境,您的操作系统可能不兼容" |
||||
|
echo "如果您在Windows上,可以尝试使用WSL或其他Linux子系统" |
||||
|
fi |
||||
|
|
||||
|
# 检查是否安装了CMake |
||||
|
if ! command -v cmake &> /dev/null; |
||||
|
then |
||||
|
echo "错误: CMake未安装,请先安装CMake" |
||||
|
echo "Ubuntu/Debian: sudo apt-get install cmake" |
||||
|
echo "CentOS/RHEL: sudo yum install cmake" |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
# 检查是否安装了GCC |
||||
|
if ! command -v gcc &> /dev/null; |
||||
|
then |
||||
|
echo "错误: GCC编译器未安装,请先安装GCC" |
||||
|
echo "Ubuntu/Debian: sudo apt-get install gcc" |
||||
|
echo "CentOS/RHEL: sudo yum install gcc" |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
# 创建构建目录 |
||||
|
mkdir -p "$build_dir" |
||||
|
cd "$build_dir" |
||||
|
|
||||
|
# 运行CMake配置 |
||||
|
echo "运行CMake配置..." |
||||
|
echo "安装前缀: $install_prefix" |
||||
|
cmake .. -DCMAKE_INSTALL_PREFIX="$install_prefix" |
||||
|
|
||||
|
if [ $? -ne 0 ]; |
||||
|
then |
||||
|
echo "CMake配置失败,请检查错误信息" |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
# 编译项目 |
||||
|
echo "编译项目..." |
||||
|
make -j$(nproc) |
||||
|
|
||||
|
if [ $? -ne 0 ]; |
||||
|
then |
||||
|
echo "编译失败,请检查错误信息" |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
# 安装(如果请求) |
||||
|
if [ "$install" = true ]; |
||||
|
then |
||||
|
echo "安装项目到 $install_prefix..." |
||||
|
sudo make install |
||||
|
|
||||
|
if [ $? -ne 0 ]; |
||||
|
then |
||||
|
echo "安装失败,请检查错误信息" |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
echo "安装成功!" |
||||
|
fi |
||||
|
|
||||
|
# 显示成功信息 |
||||
|
echo "构建成功! 可执行文件位于 $build_dir/bin/" |
||||
|
echo "运行服务器: ./$build_dir/bin/rpc_server" |
||||
|
echo "运行客户端: ./$build_dir/bin/rpc_client" |
||||
Loading…
Reference in new issue