Browse Source

调整模块

master
xyiege 2 months ago
parent
commit
8916a560dd
  1. 216
      scalib/src/rpc_client.c
  2. 3
      sckm/go.mod
  3. 13
      sckm/main.go

216
scalib/src/rpc_client.c

@ -7,12 +7,6 @@
#include "rpc_transport.h"
#include "rpc_message.h"
#ifdef _WIN32
#include <windows.h>
#else
#include <netdb.h>
#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
* stringintstring
*/
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(&params[0], RPC_TYPE_STRING);
params[0].value.string_val = file_name;
rpc_init_param(&params[1], RPC_TYPE_INT);
params[1].value.int_val = file_size;
rpc_init_param(&params[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 <server_host> <server_port> [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) {
@ -234,49 +61,14 @@ int main(int argc, char* argv[]) {
}
#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 <server_host> <server_port>\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套接字库
rpc_winsock_cleanup();

3
sckm/go.mod

@ -0,0 +1,3 @@
module sckm
go 1.24.6

13
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")
}
Loading…
Cancel
Save