diff --git a/CHANGELOG b/CHANGELOG index 57506e09249e0bf3ea257b302692fb7106296957..1c3b59fd6c88ab8bb43293bc1a0a125c0ee1df8f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,15 @@ +XEngine_ProxyServer V1.5.0.1001 + +优化:优化服务器性能和线程个数 +修改:tunnel和socks代理客户端使用了新的客户端函数 +修正:客户端关闭没有释放资源 +修正:关闭服务器崩溃 + +improved:server performance and thread number +modify:tunnel and socks proxy clients used to new client functions +fixed:client close does not free res +fixed:close server is crashed +====================================================================================== XEngine_ProxyServer V1.4.0.1001 更新:匹配XEngine 7.43版本 diff --git a/README.en.md b/README.en.md index d6ebc994caa79dccd675fd901a56e74acad2faa8..ec1ff5f5f891f29a74bc4cf1256811e269ec2fe1 100644 --- a/README.en.md +++ b/README.en.md @@ -20,6 +20,7 @@ this software support following features 6. encrypt Communication(planning) 7. load balanc(planning) 8. custom cert proxy protocol(planning) +9. multilevel proxy(planning) ## install @@ -71,8 +72,8 @@ make FLAGS=CleanAll clear You can refer to the document under the docment directory. It contains API protocol and service description. ## Test Server Address -Address:app.xyry.org or 159.75.200.173 -Port:Socks5 5400,HTTP Tunnel 5401 +Address:app.xyry.org +Port:Socks5 5400,HTTP Tunnel 5401,Forward 5402 ## Participate in contribution diff --git a/README.md b/README.md index a61f3ccda2d30609c1fb1a46cc28759d92539a6b..59f97b49b6dc4f06541f46778e10f9e91ebd9191 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ c c++ Socks5 Proxy Service,HTTP Tunnel Proxy Service,tcp forward service 6. 加密通信(planning) 7. 负载均衡(planning) 8. 自定义证书代理协议(planning) +9. 多级代理(planning) ## 安装教程 @@ -71,8 +72,8 @@ make FLAGS=CleanAll 清理编译 你可以参考docment目录下的文档.里面包含了API协议和服务说明. ## 测试服务器 -地址:app.xyry.org 或者 159.75.200.173 -端口:Socks5 5400,HTTP Tunnel 5401 +地址:app.xyry.org +端口:Socks5 5400,HTTP Tunnel 5401,Forward 5402 ## 参与贡献 @@ -82,7 +83,8 @@ make FLAGS=CleanAll 清理编译 4. 新建 Pull Request ## 开发计划 -使用线程池转发数据而不是一对一的线程 +透传代理 +转发代理支持权限和确认 ## 关注我们 如果你觉得这个软件对你有帮助,请你给我们一个START吧 diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index c3d3d2ea1c234efc353cfcd18417b39343b5fcf2..90faf060c0a14d21d6effa79276a092eccfe8cc7 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -7,8 +7,8 @@ "XMax": { "nMaxClient": 10000, "nMaxQueue": 10000, - "nIOThread": 1, - "nForwardThread": 1 + "nIOThread": 4, + "nForwardThread": 4 }, "XTime": { "nTimeCheck": 3, @@ -27,6 +27,7 @@ "tszAuthFile": "./XEngine_Config/UserList.txt" }, "XVer": [ + "1.5.0.1001 Build20230202", "1.4.0.1001 Build20221111", "1.3.1.1001 Build20220804", "1.3.0.1001 Build20220617", diff --git a/XEngine_Source/VSCopy-x64.bat b/XEngine_Source/VSCopy-x64.bat index d35706502951bc56d4094df8fc175456bd4beac9..b74c70f93848c89a247537ec9e734d6dd3fa8a0a 100644 --- a/XEngine_Source/VSCopy-x64.bat +++ b/XEngine_Source/VSCopy-x64.bat @@ -16,7 +16,4 @@ copy /y "%XEngine_Lib64%\x64\XEngine_SystemSdk\XEngine_ProcFile.dll" "./" copy /y "%XEngine_Lib64%\x64\XEngine_SystemSdk\XEngine_SystemApi.dll" "./" copy /y "%XEngine_Lib64%\x64\XEngine_LibEx\libcrypto-3-x64.dll" "./" -copy /y "%XEngine_Lib64%\x64\XEngine_LibEx\libssl-3-x64.dll" "./" -copy /y "%XEngine_Lib64%\x64\XEngine_LibEx\libcurl.dll" "./" -copy /y "%XEngine_Lib64%\XEngine_LibEx\nghttp2.dll" "./" -copy /y "%XEngine_Lib64%\x64\XEngine_HelpComponents\zlib1.dll" "./" \ No newline at end of file +copy /y "%XEngine_Lib64%\x64\XEngine_LibEx\libssl-3-x64.dll" "./" \ No newline at end of file diff --git a/XEngine_Source/VSCopy-x86.bat b/XEngine_Source/VSCopy-x86.bat index fcfad85da50c07daee2417ac18cccabbfbbfd5ab..28d01c6e0ef245f5ff910c250f19b3350b96e29c 100644 --- a/XEngine_Source/VSCopy-x86.bat +++ b/XEngine_Source/VSCopy-x86.bat @@ -16,7 +16,4 @@ copy /y "%XEngine_Lib32%\XEngine_SystemSdk\XEngine_ProcFile.dll" "./" copy /y "%XEngine_Lib32%\XEngine_SystemSdk\XEngine_SystemApi.dll" "./" copy /y "%XEngine_Lib32%\XEngine_LibEx\libcrypto-3.dll" "./" -copy /y "%XEngine_Lib32%\XEngine_LibEx\libssl-3.dll" "./" -copy /y "%XEngine_Lib32%\XEngine_LibEx\libcurl.dll" "./" -copy /y "%XEngine_Lib32%\XEngine_LibEx\nghttp2.dll" "./" -copy /y "%XEngine_Lib32%\XEngine_HelpComponents\zlib1.dll" "./" \ No newline at end of file +copy /y "%XEngine_Lib32%\XEngine_LibEx\libssl-3.dll" "./" \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h index 20646d55ef146f776e98e2d0f409a19edde9b75a..f0c77c9ae9f1b6f19c2e5637379b2e2b9242067e 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h @@ -76,9 +76,11 @@ extern XLOG xhLog; //Socks服务器 extern XHANDLE xhSocksSocket; extern XHANDLE xhSocksHeart; +extern XHANDLE xhSocksClient; //Tunnel服务器 extern XHANDLE xhTunnelSocket; extern XHANDLE xhTunnelHeart; +extern XHANDLE xhTunnelClient; //Forward服务器 extern XHANDLE xhForwardSocket; extern XHANDLE xhForwardHeart; @@ -100,8 +102,7 @@ typedef struct { TCHAR tszIPAddr[128]; ENUM_RFCCOMPONENTS_PROXY_STATUS enStatus; - SOCKET hSocket; - BOOL bClose; + XNETHANDLE xhClient; }PROXYPROTOCOL_CLIENTINFO; //连接库 diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp index 71ed7ceb13cf821af4a38f6838a90730a86a743e..fe8b972384dfacddf1b5cb82292c13503f881feb 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp @@ -115,6 +115,19 @@ void XEngine_Network_Close(LPCTSTR lpszClientAddr, int nIPProto, int nCloseType) SocketOpt_HeartBeat_DeleteAddrEx(xhSocksHeart, lpszClientAddr); NetCore_TCPXCore_CloseForClientEx(xhSocksSocket, lpszClientAddr); } + //释放客户端 + int nListCount = 0; + PROXYPROTOCOL_CLIENTINFO** ppSt_ClientList; + ProxyProtocol_SocksCore_GetList((XPPPMEM)&ppSt_ClientList, &nListCount, sizeof(PROXYPROTOCOL_CLIENTINFO)); + for (int i = 0; i < nListCount; i++) + { + if (0 == _tcsnicmp(lpszClientAddr, ppSt_ClientList[i]->tszIPAddr, _tcslen(lpszClientAddr))) + { + XClient_TCPSelect_DeleteEx(xhSocksClient, ppSt_ClientList[i]->xhClient); + break; + } + } + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ClientList, nListCount); ProxyProtocol_SocksCore_Delete(lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("SOCKS客户端:%s,离开服务器,离开类型;%d"), lpszClientAddr, nCloseType); } @@ -133,6 +146,19 @@ void XEngine_Network_Close(LPCTSTR lpszClientAddr, int nIPProto, int nCloseType) NetCore_TCPXCore_CloseForClientEx(xhTunnelSocket, lpszClientAddr); SocketOpt_HeartBeat_DeleteAddrEx(xhTunnelHeart, lpszClientAddr); } + //释放客户端 + int nListCount = 0; + PROXYPROTOCOL_CLIENTINFO** ppSt_ClientList; + ProxyProtocol_TunnelCore_GetList((XPPPMEM)&ppSt_ClientList, &nListCount, sizeof(PROXYPROTOCOL_CLIENTINFO)); + for (int i = 0; i < nListCount; i++) + { + if (0 == _tcsnicmp(lpszClientAddr, ppSt_ClientList[i]->tszIPAddr, _tcslen(lpszClientAddr))) + { + XClient_TCPSelect_DeleteEx(xhTunnelClient, ppSt_ClientList[i]->xhClient); + break; + } + } + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ClientList, nListCount); ProxyProtocol_TunnelCore_Delete(lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("Tunnel客户端:%s,离开服务器,离开类型;%d"), lpszClientAddr, nCloseType); } diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp index f7eff2375498ba01a80aceddd95f0a1448986b2b..0a23ff9cdf84f226bd25a0b34e91fc1dc4f2b8d5 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp @@ -5,9 +5,11 @@ XLOG xhLog = NULL; XHANDLE xhSocksSocket = NULL; XHANDLE xhSocksHeart = NULL; +XHANDLE xhSocksClient = NULL; XHANDLE xhTunnelSocket = NULL; XHANDLE xhTunnelHeart = NULL; +XHANDLE xhTunnelClient = NULL; XHANDLE xhForwardSocket = NULL; XHANDLE xhForwardHeart = NULL; @@ -25,11 +27,13 @@ void ServiceApp_Stop(int signo) //销毁Socks资源 NetCore_TCPXCore_DestroyEx(xhSocksSocket); SocketOpt_HeartBeat_DestoryEx(xhSocksHeart); + XClient_TCPSelect_StopEx(xhSocksClient); //销毁Tunnel资源 NetCore_TCPXCore_DestroyEx(xhTunnelSocket); SocketOpt_HeartBeat_DestoryEx(xhTunnelHeart); + XClient_TCPSelect_StopEx(xhTunnelClient); //销毁Forward资源 - HelpComponents_Packets_Destory(xhForwardPacket); + HelpComponents_Datas_Destory(xhForwardPacket); NetCore_TCPXCore_DestroyEx(xhForwardSocket); SocketOpt_HeartBeat_DestoryEx(xhForwardHeart); ManagePool_Thread_NQDestroy(xhForwardPool); @@ -160,6 +164,14 @@ int main(int argc, char** argv) //绑定网络事件 NetCore_TCPXCore_RegisterCallBackEx(xhSocksSocket, Network_Callback_SocksLogin, Network_Callback_SocksRecv, Network_Callback_SocksLeave); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,注册Socks网络事件成功")); + //客户端 + xhSocksClient = XClient_TCPSelect_StartEx(XEngine_Socks_CBRecv); + if (NULL == xhSocksClient) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动Socks客户端服务失败,错误:%lX"), XClient_GetLastError()); + goto XENGINE_SERVICEAPP_EXIT; + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动Socks客户端服务成功")); } else { @@ -193,6 +205,14 @@ int main(int argc, char** argv) XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动Tunnel网络服务器成功,Tunnel端口:%d,IO:%d"), st_ServiceConfig.nTunnelPort, st_ServiceConfig.st_XMax.nIOThread); NetCore_TCPXCore_RegisterCallBackEx(xhTunnelSocket, Network_Callback_TunnelLogin, Network_Callback_TunnelRecv, Network_Callback_TunnelLeave); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,注册Tunnel网络事件成功")); + //客户端 + xhTunnelClient = XClient_TCPSelect_StartEx(XEngine_Tunnel_CBRecv); + if (NULL == xhTunnelClient) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动Tunnel客户端服务失败,错误:%lX"), XClient_GetLastError()); + goto XENGINE_SERVICEAPP_EXIT; + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动Tunnel客户端服务成功")); } else { @@ -205,10 +225,10 @@ int main(int argc, char** argv) xhForwardPacket = HelpComponents_Datas_Init(st_ServiceConfig.st_XMax.nMaxQueue, st_ServiceConfig.st_XMax.nForwardThread); if (NULL == xhForwardPacket) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("初始化Forward组包器失败,错误:%lX"), Packets_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("初始化Forward组包器失败,错误:%lX"), Packets_GetLastError()); goto XENGINE_SERVICEAPP_EXIT; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动Forward组包器成功")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动Forward组包器成功")); //启动心跳 if (st_ServiceConfig.st_XTime.nForwardTimeOut > 0) { @@ -248,10 +268,10 @@ int main(int argc, char** argv) xhForwardPool = ManagePool_Thread_NQCreate(&ppSt_ListParam, st_ServiceConfig.st_XMax.nForwardThread); if (NULL == xhForwardPool) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动Forward线程池服务失败,错误:%lX"), ManagePool_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动Forward线程池服务失败,错误:%lX"), ManagePool_GetLastError()); goto XENGINE_SERVICEAPP_EXIT; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动Forward线程池服务成功,启动个数:%d"), st_ServiceConfig.st_XMax.nForwardThread); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动Forward线程池服务成功,启动个数:%d"), st_ServiceConfig.st_XMax.nForwardThread); } else { @@ -272,11 +292,13 @@ XENGINE_SERVICEAPP_EXIT: //销毁Socks资源 NetCore_TCPXCore_DestroyEx(xhSocksSocket); SocketOpt_HeartBeat_DestoryEx(xhSocksHeart); + XClient_TCPSelect_StopEx(xhSocksClient); //销毁Tunnel资源 NetCore_TCPXCore_DestroyEx(xhTunnelSocket); SocketOpt_HeartBeat_DestoryEx(xhTunnelHeart); + XClient_TCPSelect_StopEx(xhTunnelClient); //销毁Forward资源 - HelpComponents_Packets_Destory(xhForwardPacket); + HelpComponents_Datas_Destory(xhForwardPacket); NetCore_TCPXCore_DestroyEx(xhForwardSocket); SocketOpt_HeartBeat_DestoryEx(xhForwardHeart); ManagePool_Thread_NQDestroy(xhForwardPool); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_SocksTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_SocksTask.cpp index a2b6d446dd5fb0f1b6912dabde87dd42cbd7c746..65511dbdbe774f558473e144876a760781a1ef64 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_SocksTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_SocksTask.cpp @@ -127,7 +127,7 @@ BOOL XEngine_SocksTask_Handle(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int //连接类型,IP还是域名,没有IPV6环境.不好测试 if (ENUM_RFCCOMPONENTS_PROXYSOCKS_IPADDR_IPV4 == enIPType) { - if (!XClient_TCPSelect_Create(&st_ProxyClient.hSocket, tszClientAddr, nPort, 1)) + if (!XClient_TCPSelect_InsertEx(xhSocksClient, tszClientAddr, nPort)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("SOCKS客户端:%s,创建客户端连接失败,连接到服务器:%s:%d,错误:%lX"), lpszClientAddr, tszClientAddr, nPort, ProxyProtocol_GetLastError()); return FALSE; @@ -161,7 +161,7 @@ BOOL XEngine_SocksTask_Handle(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int memset(tszClientAddr, '\0', sizeof(tszClientAddr)); _tcscpy(tszClientAddr, ppszListAddr[0]); //随便选择一个IP地址 BaseLib_OperatorMemory_Free((XPPPMEM)&ppszListAddr, nListCount); - if (!XClient_TCPSelect_Create(&st_ProxyClient.hSocket, tszClientAddr, nPort, 1)) + if (!XClient_TCPSelect_InsertEx(xhSocksClient, tszClientAddr, nPort, &st_ProxyClient.xhClient)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("SOCKS客户端:%s,创建客户端连接失败,连接到服务器:%s:%d,错误:%lX"), lpszClientAddr, tszClientAddr, nPort, ProxyProtocol_GetLastError()); return FALSE; @@ -172,9 +172,6 @@ BOOL XEngine_SocksTask_Handle(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int st_ProxyClient.enStatus = ENUM_RFCCOMPONENTS_PROXY_STATUS_FORWARD; _tcscpy(st_ProxyClient.tszIPAddr, lpszClientAddr); ProxyProtocol_SocksCore_SetInfo(lpszClientAddr, &st_ProxyClient, sizeof(PROXYPROTOCOL_CLIENTINFO)); - //创建转发线程 - std::thread pSTDThread(XEngine_SocksTask_Thread, lpszClientAddr, st_ProxyClient.hSocket); - pSTDThread.detach(); //回复结果 ProxyProtocol_SocksCore_HdrPacket(lpszClientAddr, tszMsgBuffer, &nLen, XENGINE_RFCCOMPONENT_PROXY_SOCKS_RESPONSE_SUCCESS); XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nLen, XENGINE_CLIENT_NETTYPE_SOCKS); @@ -187,7 +184,7 @@ BOOL XEngine_SocksTask_Handle(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int memset(&st_ProxyClient, '\0', sizeof(PROXYPROTOCOL_CLIENTINFO)); if (ProxyProtocol_SocksCore_GetInfo(lpszClientAddr, &st_ProxyClient)) { - XClient_TCPSelect_SendMsg(st_ProxyClient.hSocket, lpszMsgBuffer, nMsgLen); + XClient_TCPSelect_SendEx(xhSocksClient, st_ProxyClient.xhClient, lpszMsgBuffer, &nMsgLen); } else { @@ -196,29 +193,31 @@ BOOL XEngine_SocksTask_Handle(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int } return TRUE; } -XHTHREAD CALLBACK XEngine_SocksTask_Thread(LPCTSTR lpszClientAddr, SOCKET hSocket) -{ - TCHAR tszMsgBuffer[4096]; - TCHAR tszClientAddr[128]; - memset(tszClientAddr, '\0', sizeof(tszClientAddr)); - _tcscpy(tszClientAddr, lpszClientAddr); - - while (1) +void CALLBACK XEngine_Socks_CBRecv(XHANDLE xhToken, XNETHANDLE xhClient, SOCKET hSocket, ENUM_NETCLIENT_TCPEVENTS enTCPClientEvents, LPCSTR lpszMsgBuffer, int nLen, LPVOID lParam) +{ + int nListCount = 0; + PROXYPROTOCOL_CLIENTINFO** ppSt_ClientList; + ProxyProtocol_SocksCore_GetList((XPPPMEM)&ppSt_ClientList, &nListCount, sizeof(PROXYPROTOCOL_CLIENTINFO)); + for (int i = 0; i < nListCount; i++) { - int nMsgLen = 4096; - if (!XClient_TCPSelect_RecvMsg(hSocket, tszMsgBuffer, &nMsgLen)) - { - break; - } - if (!XEngine_Network_Send(tszClientAddr, tszMsgBuffer, nMsgLen, XENGINE_CLIENT_NETTYPE_SOCKS)) + if (xhClient == ppSt_ClientList[i]->xhClient) { + if (ENUM_XENGINE_XCLIENT_SOCKET_TCP_EVENT_RECV == enTCPClientEvents) + { + if (!XEngine_Network_Send(ppSt_ClientList[i]->tszIPAddr, lpszMsgBuffer, nLen, XENGINE_CLIENT_NETTYPE_SOCKS)) + { + SocketOpt_HeartBeat_ForceOutAddrEx(xhSocksHeart, ppSt_ClientList[i]->tszIPAddr); + } + } + else if (ENUM_XENGINE_XCLIENT_SOCKET_TCP_EVENT_CLOSE == enTCPClientEvents) + { + //退出处理 + SocketOpt_HeartBeat_ForceOutAddrEx(xhSocksHeart, ppSt_ClientList[i]->tszIPAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("Socks客户端:%s,离开服务器,客户端主动断开"), ppSt_ClientList[i]->tszIPAddr); + } break; } } - //退出处理 - XClient_TCPSelect_Close(hSocket); - SocketOpt_HeartBeat_ForceOutAddrEx(xhSocksHeart, tszClientAddr); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("Socks客户端:%s,离开服务器,客户端主动断开"), tszClientAddr); - return 0; + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ClientList, nListCount); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_SocksTask.h b/XEngine_Source/XEngine_ServiceApp/XEngine_SocksTask.h index 089b403ebe3e5f16cbb0b7d9f58fbb9fac1d67b1..3185490bf25f5928283b57a765423eac6345d87f 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_SocksTask.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_SocksTask.h @@ -12,4 +12,4 @@ *********************************************************************/ //任务处理相关函数,处理包的内容 BOOL XEngine_SocksTask_Handle(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen); -XHTHREAD CALLBACK XEngine_SocksTask_Thread(LPCTSTR lpszClientAddr, SOCKET hSocket); \ No newline at end of file +void CALLBACK XEngine_Socks_CBRecv(XHANDLE xhToken, XNETHANDLE xhClient, SOCKET hSocket, ENUM_NETCLIENT_TCPEVENTS enTCPClientEvents, LPCSTR lpszMsgBuffer, int nLen, LPVOID lParam); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_TunnelTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_TunnelTask.cpp index 62531cc9212c3af42b28a54e3db7fe6dbd7e1838..ed6e9acb28b40151fcee9dcd1ac3712627267cef 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_TunnelTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_TunnelTask.cpp @@ -95,7 +95,7 @@ BOOL XEngine_TunnelTask_Handle(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in _tcscpy(tszConnectAddr, ppszListAddr[0]); //随便选择一个IP地址 BaseLib_OperatorMemory_Free((XPPPMEM)&ppszListAddr, nListCount); } - if (!XClient_TCPSelect_Create(&st_ProxyClient.hSocket, tszConnectAddr, nIPPort, 1)) + if (!XClient_TCPSelect_InsertEx(xhTunnelClient, tszConnectAddr, nIPPort, &st_ProxyClient.xhClient)) { ProxyProtocol_TunnelCore_Packet(tszMsgBuffer, &nLen, 500); XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nLen, XENGINE_CLIENT_NETTYPE_TUNNEL); @@ -106,52 +106,52 @@ BOOL XEngine_TunnelTask_Handle(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in st_ProxyClient.enStatus = ENUM_RFCCOMPONENTS_PROXY_STATUS_FORWARD; _tcscpy(st_ProxyClient.tszIPAddr, lpszClientAddr); ProxyProtocol_TunnelCore_SetInfo(lpszClientAddr, &st_ProxyClient, sizeof(PROXYPROTOCOL_CLIENTINFO)); - //启动线程 - std::thread pSTDThread(XEngine_TunnelTask_Thread, lpszClientAddr, st_ProxyClient.hSocket); - pSTDThread.detach(); //判断是代理还是非代理协议 if (bProxy) { + //客户端->代理服务->客户端 ProxyProtocol_TunnelCore_Packet(tszMsgBuffer, &nLen); XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nLen, XENGINE_CLIENT_NETTYPE_TUNNEL); } else { - //非代理协议直接发送数据 - XClient_TCPSelect_SendMsg(st_ProxyClient.hSocket, lpszMsgBuffer, nMsgLen); + //非代理协议直接发送数据,客户端->代理服务->服务器 + XClient_TCPSelect_SendEx(xhTunnelClient, st_ProxyClient.xhClient, lpszMsgBuffer, &nMsgLen); } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("Tunnel客户端:%s,创建隧道代理服务成功,连接到服务器:%s:%d,代理模式:%s"), lpszClientAddr, tszConnectAddr, nIPPort, bProxy ? "代理" : "直连"); } else { //转发数据 - XClient_TCPSelect_SendMsg(st_ProxyClient.hSocket, lpszMsgBuffer, nMsgLen); + XClient_TCPSelect_SendEx(xhTunnelClient, st_ProxyClient.xhClient, lpszMsgBuffer, &nMsgLen); } return TRUE; } -XHTHREAD CALLBACK XEngine_TunnelTask_Thread(LPCTSTR lpszClientAddr, SOCKET hSocket) -{ - TCHAR tszMsgBuffer[4096]; - TCHAR tszClientAddr[128]; - - memset(tszClientAddr, '\0', sizeof(tszClientAddr)); - _tcscpy(tszClientAddr, lpszClientAddr); - while (1) +void CALLBACK XEngine_Tunnel_CBRecv(XHANDLE xhToken, XNETHANDLE xhClient, SOCKET hSocket, ENUM_NETCLIENT_TCPEVENTS enTCPClientEvents, LPCSTR lpszMsgBuffer, int nLen, LPVOID lParam) +{ + int nListCount = 0; + PROXYPROTOCOL_CLIENTINFO** ppSt_ClientList; + ProxyProtocol_TunnelCore_GetList((XPPPMEM)&ppSt_ClientList, &nListCount, sizeof(PROXYPROTOCOL_CLIENTINFO)); + for (int i = 0; i < nListCount; i++) { - int nMsgLen = 4096; - if (!XClient_TCPSelect_RecvMsg(hSocket, tszMsgBuffer, &nMsgLen)) - { - break; - } - if (!XEngine_Network_Send(tszClientAddr, tszMsgBuffer, nMsgLen, XENGINE_CLIENT_NETTYPE_TUNNEL)) + if (xhClient == ppSt_ClientList[i]->xhClient) { + if (ENUM_XENGINE_XCLIENT_SOCKET_TCP_EVENT_RECV == enTCPClientEvents) + { + if (!XEngine_Network_Send(ppSt_ClientList[i]->tszIPAddr, lpszMsgBuffer, nLen, XENGINE_CLIENT_NETTYPE_TUNNEL)) + { + SocketOpt_HeartBeat_ForceOutAddrEx(xhTunnelHeart, ppSt_ClientList[i]->tszIPAddr); + } + } + else if (ENUM_XENGINE_XCLIENT_SOCKET_TCP_EVENT_CLOSE == enTCPClientEvents) + { + //退出处理 + SocketOpt_HeartBeat_ForceOutAddrEx(xhTunnelHeart, ppSt_ClientList[i]->tszIPAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("Tunnel客户端:%s,离开服务器,客户端主动断开"), ppSt_ClientList[i]->tszIPAddr); + } break; } } - //退出处理 - XClient_TCPSelect_Close(hSocket); - SocketOpt_HeartBeat_ForceOutAddrEx(xhTunnelHeart, tszClientAddr); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("Tunnel客户端:%s,离开服务器,客户端主动断开"), tszClientAddr); - return 0; + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ClientList, nListCount); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_TunnelTask.h b/XEngine_Source/XEngine_ServiceApp/XEngine_TunnelTask.h index e143428aef712388498fc7b9c8d9bf329d1ee729..fd8b66d41ed7aa292d11deb5b1a49c525a07928c 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_TunnelTask.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_TunnelTask.h @@ -12,4 +12,4 @@ *********************************************************************/ //任务处理相关函数,处理包的内容 BOOL XEngine_TunnelTask_Handle(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen); -XHTHREAD CALLBACK XEngine_TunnelTask_Thread(LPCTSTR lpszClientAddr, SOCKET hSocket); \ No newline at end of file +void CALLBACK XEngine_Tunnel_CBRecv(XHANDLE xhToken, XNETHANDLE xhClient, SOCKET hSocket, ENUM_NETCLIENT_TCPEVENTS enTCPClientEvents, LPCSTR lpszMsgBuffer, int nLen, LPVOID lParam); \ No newline at end of file