diff --git a/scalib/README.md b/scalib/README.md new file mode 100644 index 0000000..b79c8a4 --- /dev/null +++ b/scalib/README.md @@ -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); +``` + +## 注意事项 + +- 本项目是一个教学示例,可能不适合在生产环境中使用 +- 当前实现中,字符串参数和返回值的处理使用了简单的内存管理策略,在实际应用中可能需要更复杂的处理 +- 错误处理机制相对简单,实际应用中可能需要更完善的错误处理 \ No newline at end of file diff --git a/scalib/build.sh b/scalib/build.sh new file mode 100644 index 0000000..f140644 --- /dev/null +++ b/scalib/build.sh @@ -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" \ No newline at end of file