From 8916a560ddc0e27c7af5dfb52b5004484d4d0d9b Mon Sep 17 00:00:00 2001 From: xc Date: Sun, 28 Sep 2025 16:00:50 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scalib/src/rpc_client.c | 216 +--------------------------------------- sckm/go.mod | 3 + sckm/main.go | 13 +++ 3 files changed, 20 insertions(+), 212 deletions(-) create mode 100644 sckm/go.mod create mode 100644 sckm/main.go diff --git a/scalib/src/rpc_client.c b/scalib/src/rpc_client.c index 0f4cb55..d47f93c 100644 --- a/scalib/src/rpc_client.c +++ b/scalib/src/rpc_client.c @@ -7,12 +7,6 @@ #include "rpc_transport.h" #include "rpc_message.h" -#ifdef _WIN32 -#include -#else -#include -#endif - /* * RPC客户端结构 */ @@ -55,177 +49,10 @@ void rpc_client_destroy(rpc_client_t* client) { } } -/* - * 调用远程函数 - */ -int rpc_call(rpc_client_t* client, const char* func_name, - rpc_param_t* params, int args_count, - rpc_param_t* return_value) { - if (!client || !func_name || !client->connected) { - return RPC_INVALID_ARGS; - } - - if (args_count < 0 || args_count > MAX_ARGS_COUNT) { - return RPC_INVALID_ARGS; - } - - // 创建请求 - rpc_request_t request; - memset(&request, 0, sizeof(rpc_request_t)); - strncpy(request.func_name, func_name, MAX_FUNC_NAME_LEN - 1); - request.func_name[MAX_FUNC_NAME_LEN - 1] = '\0'; - request.args_count = args_count; - - // 复制参数 - if (args_count > 0 && params) { - for (int i = 0; i < args_count; i++) { - request.args[i] = params[i]; - // 注意:对于字符串参数,这里只是浅拷贝指针,实际应用中可能需要深拷贝 - } - } - - // 发送请求 - int ret = rpc_send_request(&client->transport, &request); - if (ret != RPC_SUCCESS) { - return ret; - } - - // 接收响应 - rpc_response_t response; - memset(&response, 0, sizeof(rpc_response_t)); - - ret = rpc_recv_response(&client->transport, &response); - if (ret != RPC_SUCCESS) { - return ret; - } - - // 检查结果代码 - if (response.result_code != RPC_SUCCESS) { - return response.result_code; - } - - // 复制返回值 - if (return_value) { - return_value->type = response.return_type; - switch (response.return_type) { - case RPC_TYPE_INT: - return_value->value.int_val = response.return_value.int_val; - break; - case RPC_TYPE_FLOAT: - return_value->value.float_val = response.return_value.float_val; - break; - case RPC_TYPE_DOUBLE: - return_value->value.double_val = response.return_value.double_val; - break; - case RPC_TYPE_STRING: - // 注意:这里需要复制字符串,避免内存问题 - if (response.return_value.string_val) { - return_value->value.string_val = strdup(response.return_value.string_val); - } else { - return_value->value.string_val = NULL; - } - break; - case RPC_TYPE_BOOL: - return_value->value.bool_val = response.return_value.bool_val; - break; - case RPC_TYPE_VOID: - default: - break; - } - } - - // 释放响应中的资源 - if (response.return_type == RPC_TYPE_STRING && response.return_value.string_val) { - free((void*)response.return_value.string_val); - } - - return RPC_SUCCESS; -} - -/* - * 调用远程文件信息发送函数 UpFileService.SendFileInfo - * 假设参数格式:文件名(string)、文件大小(int)、文件类型(string) - */ -int send_file_info(rpc_client_t* client, const char* file_name, int file_size, const char* file_type, bool* result) { - rpc_param_t params[3]; - rpc_param_t return_value; - - // 设置参数 - rpc_init_param(¶ms[0], RPC_TYPE_STRING); - params[0].value.string_val = file_name; - - rpc_init_param(¶ms[1], RPC_TYPE_INT); - params[1].value.int_val = file_size; - - rpc_init_param(¶ms[2], RPC_TYPE_STRING); - params[2].value.string_val = file_type; - - // 设置返回值 - rpc_init_param(&return_value, RPC_TYPE_BOOL); - - // 调用远程函数 - int ret = rpc_call(client, "UpFileService.SendFileInfo", params, 3, &return_value); - if (ret == RPC_SUCCESS && result) { - *result = return_value.value.bool_val; - } - - return ret; -} - -/* - * 解析命令行参数 - */ -void parse_args(int argc, char* argv[], const char** server_host, uint16_t* server_port, - const char** file_name, int* file_size, const char** file_type) { - // 默认值 - *server_host = "127.0.0.1"; - *server_port = 8080; - *file_name = "example.txt"; - *file_size = 1024; - *file_type = "text/plain"; - - // 解析命令行参数 - if (argc >= 3) { - *server_host = argv[1]; - *server_port = (uint16_t)atoi(argv[2]); - } - - if (argc >= 4) { - *file_name = argv[3]; - } - - if (argc >= 5) { - *file_size = atoi(argv[4]); - } - - if (argc >= 6) { - *file_type = argv[5]; - } -} - -/* - * 打印帮助信息 - */ -void print_help() { - printf("Usage: rpc_client [file_name] [file_size] [file_type]\n"); - printf(" server_host: RPC服务器地址 (默认: 127.0.0.1)\n"); - printf(" server_port: RPC服务器端口 (默认: 8080)\n"); - printf(" file_name: 文件名 (默认: example.txt)\n"); - printf(" file_size: 文件大小 (默认: 1024)\n"); - printf(" file_type: 文件类型 (默认: text/plain)\n"); -} - /* * 主函数 */ int main(int argc, char* argv[]) { - rpc_client_t client; - const char* server_host; - uint16_t server_port; - const char* file_name; - int file_size; - const char* file_type; - #ifdef _WIN32 // 初始化Windows套接字库 if (rpc_winsock_init() != RPC_SUCCESS) { @@ -233,49 +60,14 @@ int main(int argc, char* argv[]) { return 1; } #endif + + printf("RPC Client started\n"); - // 检查是否需要打印帮助信息 + // 简单的帮助信息 if (argc >= 2 && (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0)) { - print_help(); + printf("Usage: rpc_client \n"); return 0; } - - // 解析命令行参数 - parse_args(argc, argv, &server_host, &server_port, &file_name, &file_size, &file_type); - - // 打印参数信息 - printf("RPC Client configuration:\n"); - printf(" Server: %s:%d\n", server_host, server_port); - printf(" File name: %s\n", file_name); - printf(" File size: %d\n", file_size); - printf(" File type: %s\n", file_type); - - // 初始化客户端 - printf("Connecting to RPC server at %s:%d...\n", server_host, server_port); - int ret = rpc_client_create(&client, server_host, server_port); - if (ret != RPC_SUCCESS) { - printf("Failed to connect to server: %s\n", rpc_error_to_string(ret)); - return 1; - } - - printf("Connected to server successfully\n"); - - // 调用远程文件信息发送函数 - bool send_result = false; - ret = send_file_info(&client, file_name, file_size, file_type, &send_result); - if (ret == RPC_SUCCESS) { - printf("UpFileService.SendFileInfo call %s\n", send_result ? "succeeded" : "failed"); - if (send_result) { - printf("File info sent successfully: %s (size: %d, type: %s)\n", - file_name, file_size, file_type); - } - } else { - printf("Failed to call 'UpFileService.SendFileInfo': %s\n", rpc_error_to_string(ret)); - } - - // 清理资源 - rpc_client_destroy(&client); - printf("Client disconnected\n"); #ifdef _WIN32 // 清理Windows套接字库 diff --git a/sckm/go.mod b/sckm/go.mod new file mode 100644 index 0000000..e294ebb --- /dev/null +++ b/sckm/go.mod @@ -0,0 +1,3 @@ +module sckm + +go 1.24.6 \ No newline at end of file diff --git a/sckm/main.go b/sckm/main.go new file mode 100644 index 0000000..8fb1940 --- /dev/null +++ b/sckm/main.go @@ -0,0 +1,13 @@ +package main + +// JSONRPC 文件传输模块 +func main() { + // 初始化 JSONRPC 服务器 + server := jsonrpc.NewServer() + + // 注册文件传输方法 + server.RegisterName("FileTransfer", FileTransfer{}) + + // 启动 JSONRPC 服务器 + server.ServeTCP("localhost:8080") +}