7 changed files with 1510 additions and 913 deletions
@ -1,191 +1,381 @@ |
|||||
/*
|
/*
|
||||
|
|
||||
* rpc_message.c |
* rpc_message.c |
||||
|
|
||||
* 实现RPC消息的序列化和反序列化功能 |
* 实现RPC消息的序列化和反序列化功能 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
|
|
||||
|
|
||||
#include "rpc_message.h" |
#include "rpc_message.h" |
||||
|
|
||||
#include "rpc_transport.h" |
#include "rpc_transport.h" |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 序列化请求消息到缓冲区 |
* 序列化请求消息到缓冲区 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
int rpc_serialize_request(const rpc_request_t* request, void* buffer, size_t buffer_size) { |
int rpc_serialize_request(const rpc_request_t* request, void* buffer, size_t buffer_size) { |
||||
|
|
||||
if (!request || !buffer || buffer_size < sizeof(rpc_request_t)) { |
if (!request || !buffer || buffer_size < sizeof(rpc_request_t)) { |
||||
|
|
||||
return RPC_INVALID_ARGS; |
return RPC_INVALID_ARGS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 复制请求消息到缓冲区
|
// 复制请求消息到缓冲区
|
||||
|
|
||||
memcpy(buffer, request, sizeof(rpc_request_t)); |
memcpy(buffer, request, sizeof(rpc_request_t)); |
||||
|
|
||||
|
|
||||
|
|
||||
// 注意:这里简化了字符串参数的序列化,实际上可能需要更复杂的处理
|
// 注意:这里简化了字符串参数的序列化,实际上可能需要更复杂的处理
|
||||
|
|
||||
// 在实际应用中,可能需要计算字符串的总长度并动态分配足够的缓冲区
|
// 在实际应用中,可能需要计算字符串的总长度并动态分配足够的缓冲区
|
||||
|
|
||||
|
|
||||
|
|
||||
return RPC_SUCCESS; |
return RPC_SUCCESS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 反序列化缓冲区到请求消息 |
* 反序列化缓冲区到请求消息 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
int rpc_deserialize_request(const void* buffer, size_t buffer_size, rpc_request_t* request) { |
int rpc_deserialize_request(const void* buffer, size_t buffer_size, rpc_request_t* request) { |
||||
|
|
||||
if (!buffer || !request || buffer_size < sizeof(rpc_request_t)) { |
if (!buffer || !request || buffer_size < sizeof(rpc_request_t)) { |
||||
|
|
||||
return RPC_INVALID_ARGS; |
return RPC_INVALID_ARGS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 从缓冲区复制请求消息
|
// 从缓冲区复制请求消息
|
||||
|
|
||||
memcpy(request, buffer, sizeof(rpc_request_t)); |
memcpy(request, buffer, sizeof(rpc_request_t)); |
||||
|
|
||||
|
|
||||
|
|
||||
// 注意:这里简化了字符串参数的反序列化
|
// 注意:这里简化了字符串参数的反序列化
|
||||
|
|
||||
// 在实际应用中,可能需要处理字符串的动态分配和复制
|
// 在实际应用中,可能需要处理字符串的动态分配和复制
|
||||
|
|
||||
|
|
||||
|
|
||||
return RPC_SUCCESS; |
return RPC_SUCCESS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 序列化响应消息到缓冲区 |
* 序列化响应消息到缓冲区 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
int rpc_serialize_response(const rpc_response_t* response, void* buffer, size_t buffer_size) { |
int rpc_serialize_response(const rpc_response_t* response, void* buffer, size_t buffer_size) { |
||||
|
|
||||
if (!response || !buffer || buffer_size < sizeof(rpc_response_t)) { |
if (!response || !buffer || buffer_size < sizeof(rpc_response_t)) { |
||||
|
|
||||
return RPC_INVALID_ARGS; |
return RPC_INVALID_ARGS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 复制响应消息到缓冲区
|
// 复制响应消息到缓冲区
|
||||
|
|
||||
memcpy(buffer, response, sizeof(rpc_response_t)); |
memcpy(buffer, response, sizeof(rpc_response_t)); |
||||
|
|
||||
|
|
||||
|
|
||||
// 注意:这里简化了字符串返回值的序列化
|
// 注意:这里简化了字符串返回值的序列化
|
||||
|
|
||||
|
|
||||
|
|
||||
return RPC_SUCCESS; |
return RPC_SUCCESS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 反序列化缓冲区到响应消息 |
* 反序列化缓冲区到响应消息 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
int rpc_deserialize_response(const void* buffer, size_t buffer_size, rpc_response_t* response) { |
int rpc_deserialize_response(const void* buffer, size_t buffer_size, rpc_response_t* response) { |
||||
|
|
||||
if (!buffer || !response || buffer_size < sizeof(rpc_response_t)) { |
if (!buffer || !response || buffer_size < sizeof(rpc_response_t)) { |
||||
|
|
||||
return RPC_INVALID_ARGS; |
return RPC_INVALID_ARGS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 从缓冲区复制响应消息
|
// 从缓冲区复制响应消息
|
||||
|
|
||||
memcpy(response, buffer, sizeof(rpc_response_t)); |
memcpy(response, buffer, sizeof(rpc_response_t)); |
||||
|
|
||||
|
|
||||
|
|
||||
// 注意:这里简化了字符串返回值的反序列化
|
// 注意:这里简化了字符串返回值的反序列化
|
||||
|
|
||||
|
|
||||
|
|
||||
return RPC_SUCCESS; |
return RPC_SUCCESS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 发送请求消息 |
* 发送请求消息 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
int rpc_send_request(rpc_transport_t* transport, const rpc_request_t* request) { |
int rpc_send_request(rpc_transport_t* transport, const rpc_request_t* request) { |
||||
|
|
||||
if (!transport || !request) { |
if (!transport || !request) { |
||||
|
|
||||
return RPC_INVALID_ARGS; |
return RPC_INVALID_ARGS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
uint8_t buffer[MAX_MESSAGE_SIZE]; |
uint8_t buffer[MAX_MESSAGE_SIZE]; |
||||
|
|
||||
rpc_message_t message; |
rpc_message_t message; |
||||
|
|
||||
|
|
||||
|
|
||||
// 设置消息头部
|
// 设置消息头部
|
||||
|
|
||||
message.header.type = RPC_MESSAGE_REQUEST; |
message.header.type = RPC_MESSAGE_REQUEST; |
||||
|
|
||||
message.header.payload_size = sizeof(rpc_request_t); |
message.header.payload_size = sizeof(rpc_request_t); |
||||
|
|
||||
|
|
||||
|
|
||||
// 复制请求到消息负载
|
// 复制请求到消息负载
|
||||
|
|
||||
message.payload.request = *request; |
message.payload.request = *request; |
||||
|
|
||||
|
|
||||
|
|
||||
// 序列化整个消息
|
// 序列化整个消息
|
||||
|
|
||||
size_t message_size = sizeof(rpc_message_header_t) + message.header.payload_size; |
size_t message_size = sizeof(rpc_message_header_t) + message.header.payload_size; |
||||
|
|
||||
if (message_size > MAX_MESSAGE_SIZE) { |
if (message_size > MAX_MESSAGE_SIZE) { |
||||
|
|
||||
return RPC_ERROR; |
return RPC_ERROR; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
memcpy(buffer, &message, message_size); |
memcpy(buffer, &message, message_size); |
||||
|
|
||||
|
|
||||
|
|
||||
// 发送消息
|
// 发送消息
|
||||
|
|
||||
return rpc_transport_send(transport, buffer, message_size); |
return rpc_transport_send(transport, buffer, message_size); |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 接收请求消息 |
* 接收请求消息 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
int rpc_recv_request(rpc_transport_t* transport, rpc_request_t* request) { |
int rpc_recv_request(rpc_transport_t* transport, rpc_request_t* request) { |
||||
|
|
||||
if (!transport || !request) { |
if (!transport || !request) { |
||||
|
|
||||
return RPC_INVALID_ARGS; |
return RPC_INVALID_ARGS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
uint8_t buffer[MAX_MESSAGE_SIZE]; |
uint8_t buffer[MAX_MESSAGE_SIZE]; |
||||
|
|
||||
rpc_message_header_t header; |
rpc_message_header_t header; |
||||
|
|
||||
|
|
||||
|
|
||||
// 接收消息头部
|
// 接收消息头部
|
||||
|
|
||||
if (rpc_transport_recv(transport, &header, sizeof(rpc_message_header_t)) != RPC_SUCCESS) { |
if (rpc_transport_recv(transport, &header, sizeof(rpc_message_header_t)) != RPC_SUCCESS) { |
||||
|
|
||||
return RPC_NET_ERROR; |
return RPC_NET_ERROR; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 检查消息类型和大小
|
// 检查消息类型和大小
|
||||
|
|
||||
if (header.type != RPC_MESSAGE_REQUEST || header.payload_size > MAX_MESSAGE_SIZE - sizeof(rpc_message_header_t)) { |
if (header.type != RPC_MESSAGE_REQUEST || header.payload_size > MAX_MESSAGE_SIZE - sizeof(rpc_message_header_t)) { |
||||
|
|
||||
return RPC_ERROR; |
return RPC_ERROR; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 接收消息负载
|
// 接收消息负载
|
||||
|
|
||||
if (rpc_transport_recv(transport, request, header.payload_size) != RPC_SUCCESS) { |
if (rpc_transport_recv(transport, request, header.payload_size) != RPC_SUCCESS) { |
||||
|
|
||||
return RPC_NET_ERROR; |
return RPC_NET_ERROR; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
return RPC_SUCCESS; |
return RPC_SUCCESS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 发送响应消息 |
* 发送响应消息 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
int rpc_send_response(rpc_transport_t* transport, const rpc_response_t* response) { |
int rpc_send_response(rpc_transport_t* transport, const rpc_response_t* response) { |
||||
|
|
||||
if (!transport || !response) { |
if (!transport || !response) { |
||||
|
|
||||
return RPC_INVALID_ARGS; |
return RPC_INVALID_ARGS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
uint8_t buffer[MAX_MESSAGE_SIZE]; |
uint8_t buffer[MAX_MESSAGE_SIZE]; |
||||
|
|
||||
rpc_message_t message; |
rpc_message_t message; |
||||
|
|
||||
|
|
||||
|
|
||||
// 设置消息头部
|
// 设置消息头部
|
||||
|
|
||||
message.header.type = RPC_MESSAGE_RESPONSE; |
message.header.type = RPC_MESSAGE_RESPONSE; |
||||
|
|
||||
message.header.payload_size = sizeof(rpc_response_t); |
message.header.payload_size = sizeof(rpc_response_t); |
||||
|
|
||||
|
|
||||
|
|
||||
// 复制响应到消息负载
|
// 复制响应到消息负载
|
||||
|
|
||||
message.payload.response = *response; |
message.payload.response = *response; |
||||
|
|
||||
|
|
||||
|
|
||||
// 序列化整个消息
|
// 序列化整个消息
|
||||
|
|
||||
size_t message_size = sizeof(rpc_message_header_t) + message.header.payload_size; |
size_t message_size = sizeof(rpc_message_header_t) + message.header.payload_size; |
||||
|
|
||||
if (message_size > MAX_MESSAGE_SIZE) { |
if (message_size > MAX_MESSAGE_SIZE) { |
||||
|
|
||||
return RPC_ERROR; |
return RPC_ERROR; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
memcpy(buffer, &message, message_size); |
memcpy(buffer, &message, message_size); |
||||
|
|
||||
|
|
||||
|
|
||||
// 发送消息
|
// 发送消息
|
||||
|
|
||||
return rpc_transport_send(transport, buffer, message_size); |
return rpc_transport_send(transport, buffer, message_size); |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 接收响应消息 |
* 接收响应消息 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
int rpc_recv_response(rpc_transport_t* transport, rpc_response_t* response) { |
int rpc_recv_response(rpc_transport_t* transport, rpc_response_t* response) { |
||||
|
|
||||
if (!transport || !response) { |
if (!transport || !response) { |
||||
|
|
||||
return RPC_INVALID_ARGS; |
return RPC_INVALID_ARGS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
uint8_t buffer[MAX_MESSAGE_SIZE]; |
uint8_t buffer[MAX_MESSAGE_SIZE]; |
||||
|
|
||||
rpc_message_header_t header; |
rpc_message_header_t header; |
||||
|
|
||||
|
|
||||
|
|
||||
// 接收消息头部
|
// 接收消息头部
|
||||
|
|
||||
if (rpc_transport_recv(transport, &header, sizeof(rpc_message_header_t)) != RPC_SUCCESS) { |
if (rpc_transport_recv(transport, &header, sizeof(rpc_message_header_t)) != RPC_SUCCESS) { |
||||
|
|
||||
return RPC_NET_ERROR; |
return RPC_NET_ERROR; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 检查消息类型和大小
|
// 检查消息类型和大小
|
||||
|
|
||||
if (header.type != RPC_MESSAGE_RESPONSE || header.payload_size > MAX_MESSAGE_SIZE - sizeof(rpc_message_header_t)) { |
if (header.type != RPC_MESSAGE_RESPONSE || header.payload_size > MAX_MESSAGE_SIZE - sizeof(rpc_message_header_t)) { |
||||
|
|
||||
return RPC_ERROR; |
return RPC_ERROR; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 接收消息负载
|
// 接收消息负载
|
||||
|
|
||||
if (rpc_transport_recv(transport, response, header.payload_size) != RPC_SUCCESS) { |
if (rpc_transport_recv(transport, response, header.payload_size) != RPC_SUCCESS) { |
||||
|
|
||||
return RPC_NET_ERROR; |
return RPC_NET_ERROR; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
return RPC_SUCCESS; |
return RPC_SUCCESS; |
||||
|
|
||||
} |
} |
||||
@ -1,296 +1,591 @@ |
|||||
/*
|
/*
|
||||
|
|
||||
* rpc_server.c |
* rpc_server.c |
||||
|
|
||||
* RPC服务器实现,处理客户端连接和执行远程函数调用 |
* RPC服务器实现,处理客户端连接和执行远程函数调用 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
|
|
||||
|
|
||||
#include "rpc_common.h" |
#include "rpc_common.h" |
||||
|
|
||||
#include "rpc_transport.h" |
#include "rpc_transport.h" |
||||
|
|
||||
#include "rpc_message.h" |
#include "rpc_message.h" |
||||
|
|
||||
|
|
||||
|
|
||||
#ifdef _WIN32 |
#ifdef _WIN32 |
||||
|
|
||||
#include <windows.h> |
#include <windows.h> |
||||
|
|
||||
#else |
#else |
||||
|
|
||||
#include <pthread.h> |
#include <pthread.h> |
||||
|
|
||||
#endif |
#endif |
||||
|
|
||||
|
|
||||
|
|
||||
/* 函数处理函数类型定义 */ |
/* 函数处理函数类型定义 */ |
||||
|
|
||||
typedef int (*rpc_handler_func_t)(rpc_param_t* params, int args_count, rpc_param_t* return_value); |
typedef int (*rpc_handler_func_t)(rpc_param_t* params, int args_count, rpc_param_t* return_value); |
||||
|
|
||||
|
|
||||
|
|
||||
/* 函数处理器结构 */ |
/* 函数处理器结构 */ |
||||
|
|
||||
typedef struct { |
typedef struct { |
||||
|
|
||||
char func_name[MAX_FUNC_NAME_LEN]; |
char func_name[MAX_FUNC_NAME_LEN]; |
||||
|
|
||||
rpc_handler_func_t handler; |
rpc_handler_func_t handler; |
||||
|
|
||||
rpc_param_type_t return_type; |
rpc_param_type_t return_type; |
||||
|
|
||||
rpc_param_type_t param_types[MAX_ARGS_COUNT]; |
rpc_param_type_t param_types[MAX_ARGS_COUNT]; |
||||
|
|
||||
int param_count; |
int param_count; |
||||
|
|
||||
} rpc_handler_t; |
} rpc_handler_t; |
||||
|
|
||||
|
|
||||
|
|
||||
/* 函数处理器表 */ |
/* 函数处理器表 */ |
||||
|
|
||||
static rpc_handler_t handlers[MAX_FUNC_NAME_LEN]; |
static rpc_handler_t handlers[MAX_FUNC_NAME_LEN]; |
||||
|
|
||||
static int handler_count = 0; |
static int handler_count = 0; |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 注册远程函数 |
* 注册远程函数 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
int rpc_register_function(const char* func_name, rpc_handler_func_t handler, |
int rpc_register_function(const char* func_name, rpc_handler_func_t handler, |
||||
|
|
||||
rpc_param_type_t return_type, |
rpc_param_type_t return_type, |
||||
|
|
||||
rpc_param_type_t* param_types, int param_count) { |
rpc_param_type_t* param_types, int param_count) { |
||||
|
|
||||
if (!func_name || !handler || param_count < 0 || param_count > MAX_ARGS_COUNT) { |
if (!func_name || !handler || param_count < 0 || param_count > MAX_ARGS_COUNT) { |
||||
|
|
||||
return RPC_INVALID_ARGS; |
return RPC_INVALID_ARGS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
if (handler_count >= MAX_FUNC_NAME_LEN) { |
if (handler_count >= MAX_FUNC_NAME_LEN) { |
||||
|
|
||||
return RPC_ERROR; |
return RPC_ERROR; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 检查函数名是否已存在
|
// 检查函数名是否已存在
|
||||
|
|
||||
for (int i = 0; i < handler_count; i++) { |
for (int i = 0; i < handler_count; i++) { |
||||
|
|
||||
if (strcmp(handlers[i].func_name, func_name) == 0) { |
if (strcmp(handlers[i].func_name, func_name) == 0) { |
||||
|
|
||||
return RPC_ERROR; |
return RPC_ERROR; |
||||
|
|
||||
} |
} |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 添加新的函数处理器
|
// 添加新的函数处理器
|
||||
|
|
||||
strncpy(handlers[handler_count].func_name, func_name, MAX_FUNC_NAME_LEN - 1); |
strncpy(handlers[handler_count].func_name, func_name, MAX_FUNC_NAME_LEN - 1); |
||||
|
|
||||
handlers[handler_count].func_name[MAX_FUNC_NAME_LEN - 1] = '\0'; |
handlers[handler_count].func_name[MAX_FUNC_NAME_LEN - 1] = '\0'; |
||||
|
|
||||
handlers[handler_count].handler = handler; |
handlers[handler_count].handler = handler; |
||||
|
|
||||
handlers[handler_count].return_type = return_type; |
handlers[handler_count].return_type = return_type; |
||||
|
|
||||
handlers[handler_count].param_count = param_count; |
handlers[handler_count].param_count = param_count; |
||||
|
|
||||
|
|
||||
|
|
||||
// 复制参数类型
|
// 复制参数类型
|
||||
|
|
||||
if (param_count > 0 && param_types) { |
if (param_count > 0 && param_types) { |
||||
|
|
||||
memcpy(handlers[handler_count].param_types, param_types, |
memcpy(handlers[handler_count].param_types, param_types, |
||||
|
|
||||
sizeof(rpc_param_type_t) * param_count); |
sizeof(rpc_param_type_t) * param_count); |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
handler_count++; |
handler_count++; |
||||
|
|
||||
printf("Registered function: %s\n", func_name); |
printf("Registered function: %s\n", func_name); |
||||
|
|
||||
return RPC_SUCCESS; |
return RPC_SUCCESS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 查找函数处理器 |
* 查找函数处理器 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
rpc_handler_t* rpc_find_handler(const char* func_name) { |
rpc_handler_t* rpc_find_handler(const char* func_name) { |
||||
|
|
||||
for (int i = 0; i < handler_count; i++) { |
for (int i = 0; i < handler_count; i++) { |
||||
|
|
||||
if (strcmp(handlers[i].func_name, func_name) == 0) { |
if (strcmp(handlers[i].func_name, func_name) == 0) { |
||||
|
|
||||
return &handlers[i]; |
return &handlers[i]; |
||||
|
|
||||
} |
} |
||||
|
|
||||
} |
} |
||||
|
|
||||
return NULL; |
return NULL; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 处理客户端请求 |
* 处理客户端请求 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
#ifdef _WIN32 |
#ifdef _WIN32 |
||||
|
|
||||
DWORD WINAPI handle_client(LPVOID arg) { |
DWORD WINAPI handle_client(LPVOID arg) { |
||||
|
|
||||
#else |
#else |
||||
|
|
||||
void* handle_client(void* arg) { |
void* handle_client(void* arg) { |
||||
|
|
||||
#endif |
#endif |
||||
|
|
||||
rpc_transport_t* transport = (rpc_transport_t*)arg; |
rpc_transport_t* transport = (rpc_transport_t*)arg; |
||||
|
|
||||
rpc_request_t request; |
rpc_request_t request; |
||||
|
|
||||
rpc_response_t response; |
rpc_response_t response; |
||||
|
|
||||
int ret; |
int ret; |
||||
|
|
||||
|
|
||||
|
|
||||
while (1) { |
while (1) { |
||||
|
|
||||
// 接收请求
|
// 接收请求
|
||||
|
|
||||
ret = rpc_recv_request(transport, &request); |
ret = rpc_recv_request(transport, &request); |
||||
|
|
||||
if (ret != RPC_SUCCESS) { |
if (ret != RPC_SUCCESS) { |
||||
|
|
||||
printf("Failed to receive request: %s\n", rpc_error_to_string(ret)); |
printf("Failed to receive request: %s\n", rpc_error_to_string(ret)); |
||||
|
|
||||
break; |
break; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
printf("Received request: %s with %d arguments\n", request.func_name, request.args_count); |
printf("Received request: %s with %d arguments\n", request.func_name, request.args_count); |
||||
|
|
||||
|
|
||||
|
|
||||
// 查找函数处理器
|
// 查找函数处理器
|
||||
|
|
||||
rpc_handler_t* handler = rpc_find_handler(request.func_name); |
rpc_handler_t* handler = rpc_find_handler(request.func_name); |
||||
|
|
||||
if (!handler) { |
if (!handler) { |
||||
|
|
||||
printf("Function not found: %s\n", request.func_name); |
printf("Function not found: %s\n", request.func_name); |
||||
|
|
||||
response.result_code = RPC_FUNC_NOT_FOUND; |
response.result_code = RPC_FUNC_NOT_FOUND; |
||||
|
|
||||
response.return_type = RPC_TYPE_VOID; |
response.return_type = RPC_TYPE_VOID; |
||||
|
|
||||
rpc_send_response(transport, &response); |
rpc_send_response(transport, &response); |
||||
|
|
||||
rpc_free_request(&request); |
rpc_free_request(&request); |
||||
|
|
||||
continue; |
continue; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 检查参数数量
|
// 检查参数数量
|
||||
|
|
||||
if (request.args_count != handler->param_count) { |
if (request.args_count != handler->param_count) { |
||||
|
|
||||
printf("Invalid argument count for %s\n", request.func_name); |
printf("Invalid argument count for %s\n", request.func_name); |
||||
|
|
||||
response.result_code = RPC_INVALID_ARGS; |
response.result_code = RPC_INVALID_ARGS; |
||||
|
|
||||
response.return_type = RPC_TYPE_VOID; |
response.return_type = RPC_TYPE_VOID; |
||||
|
|
||||
rpc_send_response(transport, &response); |
rpc_send_response(transport, &response); |
||||
|
|
||||
rpc_free_request(&request); |
rpc_free_request(&request); |
||||
|
|
||||
continue; |
continue; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 执行函数
|
// 执行函数
|
||||
|
|
||||
rpc_param_t return_value; |
rpc_param_t return_value; |
||||
|
|
||||
rpc_init_param(&return_value, handler->return_type); |
rpc_init_param(&return_value, handler->return_type); |
||||
|
|
||||
|
|
||||
|
|
||||
ret = handler->handler(request.args, request.args_count, &return_value); |
ret = handler->handler(request.args, request.args_count, &return_value); |
||||
|
|
||||
|
|
||||
|
|
||||
// 设置响应
|
// 设置响应
|
||||
|
|
||||
response.result_code = ret; |
response.result_code = ret; |
||||
|
|
||||
response.return_type = handler->return_type; |
response.return_type = handler->return_type; |
||||
|
|
||||
|
|
||||
|
|
||||
// 复制返回值
|
// 复制返回值
|
||||
|
|
||||
switch (handler->return_type) { |
switch (handler->return_type) { |
||||
|
|
||||
case RPC_TYPE_INT: |
case RPC_TYPE_INT: |
||||
|
|
||||
response.return_value.int_val = return_value.value.int_val; |
response.return_value.int_val = return_value.value.int_val; |
||||
|
|
||||
break; |
break; |
||||
|
|
||||
case RPC_TYPE_FLOAT: |
case RPC_TYPE_FLOAT: |
||||
|
|
||||
response.return_value.float_val = return_value.value.float_val; |
response.return_value.float_val = return_value.value.float_val; |
||||
|
|
||||
break; |
break; |
||||
|
|
||||
case RPC_TYPE_DOUBLE: |
case RPC_TYPE_DOUBLE: |
||||
|
|
||||
response.return_value.double_val = return_value.value.double_val; |
response.return_value.double_val = return_value.value.double_val; |
||||
|
|
||||
break; |
break; |
||||
|
|
||||
case RPC_TYPE_STRING: |
case RPC_TYPE_STRING: |
||||
|
|
||||
// 注意:这里需要复制字符串,避免内存问题
|
// 注意:这里需要复制字符串,避免内存问题
|
||||
|
|
||||
response.return_value.string_val = strdup(return_value.value.string_val); |
response.return_value.string_val = strdup(return_value.value.string_val); |
||||
|
|
||||
break; |
break; |
||||
|
|
||||
case RPC_TYPE_BOOL: |
case RPC_TYPE_BOOL: |
||||
|
|
||||
response.return_value.bool_val = return_value.value.bool_val; |
response.return_value.bool_val = return_value.value.bool_val; |
||||
|
|
||||
break; |
break; |
||||
|
|
||||
case RPC_TYPE_VOID: |
case RPC_TYPE_VOID: |
||||
|
|
||||
default: |
default: |
||||
|
|
||||
break; |
break; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 发送响应
|
// 发送响应
|
||||
|
|
||||
rpc_send_response(transport, &response); |
rpc_send_response(transport, &response); |
||||
|
|
||||
|
|
||||
|
|
||||
// 释放资源
|
// 释放资源
|
||||
|
|
||||
rpc_free_request(&request); |
rpc_free_request(&request); |
||||
|
|
||||
if (handler->return_type == RPC_TYPE_STRING && return_value.value.string_val) { |
if (handler->return_type == RPC_TYPE_STRING && return_value.value.string_val) { |
||||
|
|
||||
free((void*)return_value.value.string_val); |
free((void*)return_value.value.string_val); |
||||
|
|
||||
} |
} |
||||
|
|
||||
if (response.return_type == RPC_TYPE_STRING && response.return_value.string_val) { |
if (response.return_type == RPC_TYPE_STRING && response.return_value.string_val) { |
||||
|
|
||||
free((void*)response.return_value.string_val); |
free((void*)response.return_value.string_val); |
||||
|
|
||||
} |
} |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 关闭连接
|
// 关闭连接
|
||||
|
|
||||
rpc_transport_close(transport); |
rpc_transport_close(transport); |
||||
|
|
||||
free(transport); |
free(transport); |
||||
|
|
||||
|
|
||||
|
|
||||
#ifdef _WIN32 |
#ifdef _WIN32 |
||||
|
|
||||
return 0; |
return 0; |
||||
|
|
||||
#else |
#else |
||||
|
|
||||
return NULL; |
return NULL; |
||||
|
|
||||
#endif |
#endif |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 示例函数:加法 |
* 示例函数:加法 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
int add_handler(rpc_param_t* params, int args_count, rpc_param_t* return_value) { |
int add_handler(rpc_param_t* params, int args_count, rpc_param_t* return_value) { |
||||
|
|
||||
if (args_count < 2 || params[0].type != RPC_TYPE_INT || params[1].type != RPC_TYPE_INT) { |
if (args_count < 2 || params[0].type != RPC_TYPE_INT || params[1].type != RPC_TYPE_INT) { |
||||
|
|
||||
return RPC_INVALID_ARGS; |
return RPC_INVALID_ARGS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
int a = params[0].value.int_val; |
int a = params[0].value.int_val; |
||||
|
|
||||
int b = params[1].value.int_val; |
int b = params[1].value.int_val; |
||||
|
|
||||
|
|
||||
|
|
||||
return_value->value.int_val = a + b; |
return_value->value.int_val = a + b; |
||||
|
|
||||
|
|
||||
|
|
||||
printf("Executed add(%d, %d) = %d\n", a, b, return_value->value.int_val); |
printf("Executed add(%d, %d) = %d\n", a, b, return_value->value.int_val); |
||||
|
|
||||
return RPC_SUCCESS; |
return RPC_SUCCESS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 示例函数:获取服务器信息 |
* 示例函数:获取服务器信息 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
int get_server_info_handler(rpc_param_t* params, int args_count, rpc_param_t* return_value) { |
int get_server_info_handler(rpc_param_t* params, int args_count, rpc_param_t* return_value) { |
||||
|
|
||||
const char* info = "RPC Server v1.0"; |
const char* info = "RPC Server v1.0"; |
||||
|
|
||||
return_value->value.string_val = strdup(info); |
return_value->value.string_val = strdup(info); |
||||
|
|
||||
|
|
||||
|
|
||||
printf("Executed get_server_info()\n"); |
printf("Executed get_server_info()\n"); |
||||
|
|
||||
return RPC_SUCCESS; |
return RPC_SUCCESS; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
/*
|
/*
|
||||
|
|
||||
* 主函数 |
* 主函数 |
||||
|
|
||||
*/ |
*/ |
||||
|
|
||||
int main(int argc, char* argv[]) { |
int main(int argc, char* argv[]) { |
||||
|
|
||||
rpc_server_t server; |
rpc_server_t server; |
||||
|
|
||||
int port = 8080; |
int port = 8080; |
||||
|
|
||||
|
|
||||
|
|
||||
#ifdef _WIN32 |
#ifdef _WIN32 |
||||
|
|
||||
// 初始化Windows套接字库
|
// 初始化Windows套接字库
|
||||
|
|
||||
if (rpc_winsock_init() != RPC_SUCCESS) { |
if (rpc_winsock_init() != RPC_SUCCESS) { |
||||
|
|
||||
printf("Failed to initialize Winsock\n"); |
printf("Failed to initialize Winsock\n"); |
||||
|
|
||||
return 1; |
return 1; |
||||
|
|
||||
} |
} |
||||
|
|
||||
#endif |
#endif |
||||
|
|
||||
|
|
||||
|
|
||||
// 注册示例函数
|
// 注册示例函数
|
||||
|
|
||||
rpc_param_type_t add_params[] = {RPC_TYPE_INT, RPC_TYPE_INT}; |
rpc_param_type_t add_params[] = {RPC_TYPE_INT, RPC_TYPE_INT}; |
||||
|
|
||||
rpc_register_function("add", add_handler, RPC_TYPE_INT, add_params, 2); |
rpc_register_function("add", add_handler, RPC_TYPE_INT, add_params, 2); |
||||
|
|
||||
rpc_register_function("get_server_info", get_server_info_handler, RPC_TYPE_STRING, NULL, 0); |
rpc_register_function("get_server_info", get_server_info_handler, RPC_TYPE_STRING, NULL, 0); |
||||
|
|
||||
|
|
||||
|
|
||||
// 初始化服务器
|
// 初始化服务器
|
||||
|
|
||||
if (rpc_server_init(&server, "0.0.0.0", port, 5) != RPC_SUCCESS) { |
if (rpc_server_init(&server, "0.0.0.0", port, 5) != RPC_SUCCESS) { |
||||
|
|
||||
printf("Failed to initialize server\n"); |
printf("Failed to initialize server\n"); |
||||
|
|
||||
return 1; |
return 1; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
printf("RPC Server listening on port %d\n", port); |
printf("RPC Server listening on port %d\n", port); |
||||
|
|
||||
printf("Waiting for client connections...\n"); |
printf("Waiting for client connections...\n"); |
||||
|
|
||||
|
|
||||
|
|
||||
while (1) { |
while (1) { |
||||
|
|
||||
// 接受客户端连接
|
// 接受客户端连接
|
||||
|
|
||||
rpc_transport_t* client_transport = (rpc_transport_t*)malloc(sizeof(rpc_transport_t)); |
rpc_transport_t* client_transport = (rpc_transport_t*)malloc(sizeof(rpc_transport_t)); |
||||
|
|
||||
if (!client_transport) { |
if (!client_transport) { |
||||
|
|
||||
printf("Failed to allocate memory\n"); |
printf("Failed to allocate memory\n"); |
||||
|
|
||||
continue; |
continue; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
if (rpc_server_accept(&server, client_transport) != RPC_SUCCESS) { |
if (rpc_server_accept(&server, client_transport) != RPC_SUCCESS) { |
||||
|
|
||||
free(client_transport); |
free(client_transport); |
||||
|
|
||||
continue; |
continue; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 创建线程处理客户端请求
|
// 创建线程处理客户端请求
|
||||
|
|
||||
#ifdef _WIN32 |
#ifdef _WIN32 |
||||
|
|
||||
HANDLE thread_handle = CreateThread( |
HANDLE thread_handle = CreateThread( |
||||
|
|
||||
NULL, // 默认安全属性
|
NULL, // 默认安全属性
|
||||
|
|
||||
0, // 默认堆栈大小
|
0, // 默认堆栈大小
|
||||
|
|
||||
handle_client, // 线程函数
|
handle_client, // 线程函数
|
||||
|
|
||||
client_transport, // 线程参数
|
client_transport, // 线程参数
|
||||
|
|
||||
0, // 默认创建标志
|
0, // 默认创建标志
|
||||
|
|
||||
NULL // 线程ID(不需要)
|
NULL // 线程ID(不需要)
|
||||
|
|
||||
); |
); |
||||
|
|
||||
if (thread_handle == NULL) { |
if (thread_handle == NULL) { |
||||
|
|
||||
fprintf(stderr, "CreateThread failed with error code: %d\n", GetLastError()); |
fprintf(stderr, "CreateThread failed with error code: %d\n", GetLastError()); |
||||
|
|
||||
rpc_transport_close(client_transport); |
rpc_transport_close(client_transport); |
||||
|
|
||||
free(client_transport); |
free(client_transport); |
||||
|
|
||||
continue; |
continue; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 关闭线程句柄但不终止线程,让线程自动结束
|
// 关闭线程句柄但不终止线程,让线程自动结束
|
||||
|
|
||||
CloseHandle(thread_handle); |
CloseHandle(thread_handle); |
||||
|
|
||||
#else |
#else |
||||
|
|
||||
pthread_t thread_id; |
pthread_t thread_id; |
||||
|
|
||||
if (pthread_create(&thread_id, NULL, handle_client, client_transport) != 0) { |
if (pthread_create(&thread_id, NULL, handle_client, client_transport) != 0) { |
||||
|
|
||||
perror("pthread_create failed"); |
perror("pthread_create failed"); |
||||
|
|
||||
rpc_transport_close(client_transport); |
rpc_transport_close(client_transport); |
||||
|
|
||||
free(client_transport); |
free(client_transport); |
||||
|
|
||||
continue; |
continue; |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 分离线程,自动回收资源
|
// 分离线程,自动回收资源
|
||||
|
|
||||
pthread_detach(thread_id); |
pthread_detach(thread_id); |
||||
|
|
||||
#endif |
#endif |
||||
|
|
||||
} |
} |
||||
|
|
||||
|
|
||||
|
|
||||
// 关闭服务器
|
// 关闭服务器
|
||||
|
|
||||
rpc_server_close(&server); |
rpc_server_close(&server); |
||||
|
|
||||
|
|
||||
|
|
||||
#ifdef _WIN32 |
#ifdef _WIN32 |
||||
|
|
||||
// 清理Windows套接字库
|
// 清理Windows套接字库
|
||||
|
|
||||
rpc_winsock_cleanup(); |
rpc_winsock_cleanup(); |
||||
|
|
||||
#endif |
#endif |
||||
|
|
||||
|
|
||||
|
|
||||
return 0; |
return 0; |
||||
|
|
||||
} |
} |
||||
@ -1,40 +0,0 @@ |
|||||
@echo off |
|
||||
REM 测试CMake配置的脚本 |
|
||||
|
|
||||
REM 设置构建目录 |
|
||||
set BUILD_DIR=build_test |
|
||||
|
|
||||
REM 清理旧的构建目录 |
|
||||
if exist %BUILD_DIR% rmdir /s /q %BUILD_DIR% |
|
||||
|
|
||||
REM 创建构建目录 |
|
||||
mkdir %BUILD_DIR% |
|
||||
|
|
||||
REM 运行CMake配置 |
|
||||
pushd %BUILD_DIR% |
|
||||
cmake .. |
|
||||
if %ERRORLEVEL% neq 0 ( |
|
||||
echo CMake配置失败! |
|
||||
popd |
|
||||
exit /b 1 |
|
||||
) |
|
||||
|
|
||||
REM 构建项目 |
|
||||
cmake --build . --config Release |
|
||||
if %ERRORLEVEL% neq 0 ( |
|
||||
echo 构建失败! |
|
||||
popd |
|
||||
exit /b 1 |
|
||||
) |
|
||||
|
|
||||
popd |
|
||||
|
|
||||
REM 检查bin目录是否存在 |
|
||||
if exist bin ( |
|
||||
echo bin目录已创建 |
|
||||
dir bin |
|
||||
) else ( |
|
||||
echo bin目录未创建 |
|
||||
) |
|
||||
|
|
||||
pause |
|
||||
@ -1,33 +0,0 @@ |
|||||
@echo off |
|
||||
REM 简单的测试编译脚本 |
|
||||
|
|
||||
REM 设置Visual Studio环境 |
|
||||
REM 尝试检测Visual Studio安装路径 |
|
||||
set VS170COMNTOOLS= |
|
||||
for /f "delims=" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "17.0" 2^>nul') do ( |
|
||||
for /f "tokens=2*" %%j in ("%%i") do set "VS170COMNTOOLS=%%kCommon7\Tools\" |
|
||||
) |
|
||||
|
|
||||
REM 如果找不到Visual Studio 2022,尝试其他版本 |
|
||||
if not exist "%VS170COMNTOOLS%vsdevcmd.bat" ( |
|
||||
echo 无法找到Visual Studio 2022环境 |
|
||||
pause |
|
||||
exit /b 1 |
|
||||
) |
|
||||
|
|
||||
REM 设置环境变量 |
|
||||
call "%VS170COMNTOOLS%vsdevcmd.bat" -arch=x64 |
|
||||
|
|
||||
REM 设置编译选项 |
|
||||
set INCLUDE_DIR=include |
|
||||
set SRC_DIR=src |
|
||||
|
|
||||
REM 编译服务器 |
|
||||
cl.exe /I%INCLUDE_DIR% %SRC_DIR%\rpc_server.c %SRC_DIR%\rpc_common.c %SRC_DIR%\rpc_transport.c %SRC_DIR%\rpc_message.c /link ws2_32.lib /out:rpc_server_test.exe |
|
||||
|
|
||||
REM 检查编译结果 |
|
||||
if %ERRORLEVEL% EQU 0 ( |
|
||||
echo 编译成功!可执行文件: rpc_server_test.exe |
|
||||
) else ( |
|
||||
echo 编译失败! |
|
||||
) |
|
||||
Loading…
Reference in new issue