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