diff --git a/scalib/include/rpc_message.h b/scalib/include/rpc_message.h index a66f8a6..089e7c7 100644 --- a/scalib/include/rpc_message.h +++ b/scalib/include/rpc_message.h @@ -7,6 +7,7 @@ #define RPC_MESSAGE_H #include "rpc_common.h" +#include "rpc_transport.h" /* 消息类型枚举 */ typedef enum { diff --git a/scalib/src/rpc_server.c b/scalib/src/rpc_server.c index f5fc3e0..1704ca8 100644 --- a/scalib/src/rpc_server.c +++ b/scalib/src/rpc_server.c @@ -9,21 +9,10 @@ #ifdef _WIN32 #include -typedef DWORD WINAPI (*ThreadFunction)(LPVOID lpParam); #else #include #endif -/* - * Windows平台的线程函数包装器 - */ -#ifdef _WIN32 -DWORD WINAPI thread_wrapper(LPVOID lpParam) { - handle_client(lpParam); - return 0; -} -#endif - /* 函数处理函数类型定义 */ typedef int (*rpc_handler_func_t)(rpc_param_t* params, int args_count, rpc_param_t* return_value); @@ -94,7 +83,11 @@ rpc_handler_t* rpc_find_handler(const char* func_name) { /* * 处理客户端请求 */ +#ifdef _WIN32 +DWORD WINAPI handle_client(LPVOID arg) { +#else void* handle_client(void* arg) { +#endif rpc_transport_t* transport = (rpc_transport_t*)arg; rpc_request_t request; rpc_response_t response; @@ -181,7 +174,11 @@ void* handle_client(void* arg) { rpc_transport_close(transport); free(transport); +#ifdef _WIN32 + return 0; +#else return NULL; +#endif } /* @@ -259,7 +256,7 @@ int main(int argc, char* argv[]) { HANDLE thread_handle = CreateThread( NULL, // 默认安全属性 0, // 默认堆栈大小 - thread_wrapper, // 线程函数 + handle_client, // 线程函数 client_transport, // 线程参数 0, // 默认创建标志 NULL // 线程ID(不需要) diff --git a/scalib/src/rpc_transport.c b/scalib/src/rpc_transport.c index a397dc8..14c1450 100644 --- a/scalib/src/rpc_transport.c +++ b/scalib/src/rpc_transport.c @@ -69,8 +69,15 @@ int rpc_server_init(rpc_server_t* server, const char* host, uint16_t port, int b // 设置套接字选项,允许地址重用 int opt = 1; +#ifdef _WIN32 + // Windows不支持SO_REUSEPORT + if (setsockopt(server->server_fd, SOL_SOCKET, SO_REUSEADDR, + &opt, sizeof(opt)) != 0) { +#else + // Linux/Unix支持SO_REUSEPORT if (setsockopt(server->server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)) != 0) { +#endif PRINT_ERROR("setsockopt failed"); CLOSE_SOCKET(server->server_fd); return RPC_NET_ERROR;