|
|
@ -7,12 +7,6 @@ |
|
|
#include "rpc_transport.h" |
|
|
#include "rpc_transport.h" |
|
|
#include "rpc_message.h" |
|
|
#include "rpc_message.h" |
|
|
|
|
|
|
|
|
#ifdef _WIN32 |
|
|
|
|
|
#include <windows.h> |
|
|
|
|
|
#else |
|
|
|
|
|
#include <netdb.h> |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
/*
|
|
|
* RPC客户端结构 |
|
|
* 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 <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[]) { |
|
|
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 |
|
|
#ifdef _WIN32 |
|
|
// 初始化Windows套接字库
|
|
|
// 初始化Windows套接字库
|
|
|
if (rpc_winsock_init() != RPC_SUCCESS) { |
|
|
if (rpc_winsock_init() != RPC_SUCCESS) { |
|
|
@ -234,49 +61,14 @@ int main(int argc, char* argv[]) { |
|
|
} |
|
|
} |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
// 检查是否需要打印帮助信息
|
|
|
printf("RPC Client started\n"); |
|
|
|
|
|
|
|
|
|
|
|
// 简单的帮助信息
|
|
|
if (argc >= 2 && (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0)) { |
|
|
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; |
|
|
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 |
|
|
#ifdef _WIN32 |
|
|
// 清理Windows套接字库
|
|
|
// 清理Windows套接字库
|
|
|
rpc_winsock_cleanup(); |
|
|
rpc_winsock_cleanup(); |
|
|
|