diff --git a/CHANGELOG b/CHANGELOG index 025323768fb7e651075ca93e4eab4ed6e0fded3d..57506e09249e0bf3ea257b302692fb7106296957 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,13 @@ +XEngine_ProxyServer V1.4.0.1001 + +更新:匹配XEngine 7.43版本 +修改:使用新的方式来关闭客户端 +修正:当客户端关闭某些时候回崩溃的问题 + +update:match xengine v7.43 +modify:use the new way to close the client +fixed:crashed when client is closed +====================================================================================== XEngine_ProxyServer V1.3.1.1001 更新:匹配XEngine 7.38版本 diff --git a/README.md b/README.md index 6349a8d8ef9126c609d93ab029332afab84d4953..a61f3ccda2d30609c1fb1a46cc28759d92539a6b 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,9 @@ make FLAGS=CleanAll 清理编译 3. 提交代码 4. 新建 Pull Request +## 开发计划 +使用线程池转发数据而不是一对一的线程 + ## 关注我们 如果你觉得这个软件对你有帮助,请你给我们一个START吧 diff --git a/XEngine_APPClient/APPClient_ForwardExample/APPClient_ForwardExample.cpp b/XEngine_APPClient/APPClient_ForwardExample/APPClient_ForwardExample.cpp index 708502da57b6cf8374ffc7553d0d6d44d93f281c..f5ba9c4ff7a6829cd8cc15fdd5685011914a801c 100644 --- a/XEngine_APPClient/APPClient_ForwardExample/APPClient_ForwardExample.cpp +++ b/XEngine_APPClient/APPClient_ForwardExample/APPClient_ForwardExample.cpp @@ -150,7 +150,7 @@ int main(int argc, char** argv) memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen, FALSE)) + if (XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen)) { printf("%s\n", tszMsgBuffer); } diff --git a/XEngine_APPClient/APPClient_SocksExample/APPClient_SocksExample.cpp b/XEngine_APPClient/APPClient_SocksExample/APPClient_SocksExample.cpp index 9c521af53c4b8262cb24a644f09aa5f7c7a37a4f..004e160898d3c68d328df0a2ea03a598c96e7ba1 100644 --- a/XEngine_APPClient/APPClient_SocksExample/APPClient_SocksExample.cpp +++ b/XEngine_APPClient/APPClient_SocksExample/APPClient_SocksExample.cpp @@ -54,7 +54,7 @@ int main(int argc, char** argv) nMsgLen = 2048; memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen, FALSE)) + if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen)) { printf("接受数据失败!\n"); return 0; @@ -72,7 +72,7 @@ int main(int argc, char** argv) nMsgLen = 2048; memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen, FALSE)) + if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen)) { printf("接受数据失败!\n"); return 0; @@ -94,7 +94,7 @@ int main(int argc, char** argv) } nMsgLen = 2048; memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen, FALSE)) + if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen)) { printf("接受数据失败!\n"); return 0; @@ -112,7 +112,7 @@ int main(int argc, char** argv) { nMsgLen = 2048; memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen, FALSE)) + if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen)) { break; } diff --git a/XEngine_APPClient/APPClient_TunnelExample/APPClient_TunnelExample.cpp b/XEngine_APPClient/APPClient_TunnelExample/APPClient_TunnelExample.cpp index a11d0cbae15c5c6671c76159ab0557827d4eb214..aeceed6756e7e9a9d692662f76e23a9438fcfb4c 100644 --- a/XEngine_APPClient/APPClient_TunnelExample/APPClient_TunnelExample.cpp +++ b/XEngine_APPClient/APPClient_TunnelExample/APPClient_TunnelExample.cpp @@ -31,6 +31,7 @@ int main(int argc, char** argv) #endif SOCKET m_Socket; LPCTSTR lpszServiceAddr = _T("127.0.0.1"); + if (!XClient_TCPSelect_Create(&m_Socket, lpszServiceAddr, 5401)) { printf("连接失败!错误:%lX\n", XClient_GetLastError()); @@ -50,7 +51,7 @@ int main(int argc, char** argv) nMsgLen = 2048; memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen, FALSE)) + if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen)) { printf("接受数据失败!\n"); return 0; @@ -68,7 +69,7 @@ int main(int argc, char** argv) { nMsgLen = 2048; memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen, FALSE)) + if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nMsgLen)) { break; } diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index 4dd15e73b0649f5f8290a683dd80c8fb13b82573..c3d3d2ea1c234efc353cfcd18417b39343b5fcf2 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -12,9 +12,9 @@ }, "XTime": { "nTimeCheck": 3, - "nSocksTimeOut": 0, - "nTunnelTimeOut": 0, - "nForwardTimeOut": 0 + "nSocksTimeOut": 5, + "nTunnelTimeOut": 5, + "nForwardTimeOut": 5 }, "XLog": { "MaxSize": 1024000, @@ -23,10 +23,11 @@ "tszLogFile": "./XEngine_Log/XEngine_ServiceApp.log" }, "XAuth": { - "bAuth": 2, + "bAuth": 0, "tszAuthFile": "./XEngine_Config/UserList.txt" }, "XVer": [ + "1.4.0.1001 Build20221111", "1.3.1.1001 Build20220804", "1.3.0.1001 Build20220617", "1.2.0.1001 Build20220413", diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h index 0800aa67a295a4fb0fefe0ad85bd978c3ddc5e7b..20646d55ef146f776e98e2d0f409a19edde9b75a 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h @@ -83,7 +83,7 @@ extern XHANDLE xhTunnelHeart; extern XHANDLE xhForwardSocket; extern XHANDLE xhForwardHeart; extern XHANDLE xhForwardPacket; -extern XNETHANDLE xhForwardPool; +extern XHANDLE xhForwardPool; //配置文件 extern XENGINE_SERVICECONFIG st_ServiceConfig; diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp index d9b27f30fb6d71f086578ba9cded56cf2b82c781..71ed7ceb13cf821af4a38f6838a90730a86a743e 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp @@ -115,13 +115,7 @@ void XEngine_Network_Close(LPCTSTR lpszClientAddr, int nIPProto, int nCloseType) SocketOpt_HeartBeat_DeleteAddrEx(xhSocksHeart, lpszClientAddr); NetCore_TCPXCore_CloseForClientEx(xhSocksSocket, lpszClientAddr); } - PROXYPROTOCOL_CLIENTINFO st_ProxyClient; - memset(&st_ProxyClient, '\0', sizeof(PROXYPROTOCOL_CLIENTINFO)); - if (ProxyProtocol_SocksCore_GetInfo(lpszClientAddr, &st_ProxyClient)) - { - st_ProxyClient.bClose = TRUE; - ProxyProtocol_SocksCore_SetInfo(lpszClientAddr, &st_ProxyClient, sizeof(PROXYPROTOCOL_CLIENTINFO)); - } + ProxyProtocol_SocksCore_Delete(lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("SOCKS客户端:%s,离开服务器,离开类型;%d"), lpszClientAddr, nCloseType); } else if (XENGINE_CLIENT_NETTYPE_TUNNEL == nIPProto) @@ -136,16 +130,10 @@ void XEngine_Network_Close(LPCTSTR lpszClientAddr, int nIPProto, int nCloseType) } else { - SocketOpt_HeartBeat_DeleteAddrEx(xhTunnelHeart, lpszClientAddr); NetCore_TCPXCore_CloseForClientEx(xhTunnelSocket, lpszClientAddr); + SocketOpt_HeartBeat_DeleteAddrEx(xhTunnelHeart, lpszClientAddr); } - PROXYPROTOCOL_CLIENTINFO st_ProxyClient; - memset(&st_ProxyClient, '\0', sizeof(PROXYPROTOCOL_CLIENTINFO)); - if (ProxyProtocol_TunnelCore_GetInfo(lpszClientAddr, &st_ProxyClient)) - { - st_ProxyClient.bClose = TRUE; - ProxyProtocol_TunnelCore_SetInfo(lpszClientAddr, &st_ProxyClient, sizeof(PROXYPROTOCOL_CLIENTINFO)); - } + ProxyProtocol_TunnelCore_Delete(lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("Tunnel客户端:%s,离开服务器,离开类型;%d"), lpszClientAddr, nCloseType); } else if (XENGINE_CLIENT_NETTYPE_FORWARD == nIPProto) diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp index 219d930421ec3d0d57c8fd6c4e6190c0ecca45da..f7eff2375498ba01a80aceddd95f0a1448986b2b 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp @@ -12,7 +12,7 @@ XHANDLE xhTunnelHeart = NULL; XHANDLE xhForwardSocket = NULL; XHANDLE xhForwardHeart = NULL; XHANDLE xhForwardPacket = NULL; -XNETHANDLE xhForwardPool = 0; +XHANDLE xhForwardPool = NULL; //配置文件 XENGINE_SERVICECONFIG st_ServiceConfig; @@ -245,7 +245,8 @@ int main(int argc, char** argv) ppSt_ListParam[i]->lParam = pInt_Pos; ppSt_ListParam[i]->fpCall_ThreadsTask = XEngine_Forward_Thread; } - if (!ManagePool_Thread_NQCreate(&xhForwardPool, &ppSt_ListParam, st_ServiceConfig.st_XMax.nForwardThread)) + 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()); goto XENGINE_SERVICEAPP_EXIT; diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_SocksTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_SocksTask.cpp index 6ddb638bd70ab059c458b955e36aba62f14ab573..a2b6d446dd5fb0f1b6912dabde87dd42cbd7c746 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_SocksTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_SocksTask.cpp @@ -199,28 +199,26 @@ BOOL XEngine_SocksTask_Handle(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int 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) { int nMsgLen = 4096; - if (!XClient_TCPSelect_RecvMsg(hSocket, tszMsgBuffer, &nMsgLen, FALSE)) + if (!XClient_TCPSelect_RecvMsg(hSocket, tszMsgBuffer, &nMsgLen)) { break; } - XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen, XENGINE_CLIENT_NETTYPE_SOCKS); - } - //退出处理 - PROXYPROTOCOL_CLIENTINFO st_ProxyClient; - memset(&st_ProxyClient, '\0', sizeof(PROXYPROTOCOL_CLIENTINFO)); - if (ProxyProtocol_SocksCore_GetInfo(lpszClientAddr, &st_ProxyClient)) - { - ProxyProtocol_SocksCore_Delete(lpszClientAddr); - //是主动关闭的还是被动触发的 - if (!st_ProxyClient.bClose) + if (!XEngine_Network_Send(tszClientAddr, tszMsgBuffer, nMsgLen, XENGINE_CLIENT_NETTYPE_SOCKS)) { - //主动关闭,需要调用 - XClient_TCPSelect_Close(st_ProxyClient.hSocket); - XEngine_Network_Close(lpszClientAddr, XENGINE_CLIENT_NETTYPE_SOCKS, XENGINE_CLIENT_CLOSE_SERVICE); + 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; } \ 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 5b9b4c05f233d7d1d58f7abd09480b0b413f68b0..62531cc9212c3af42b28a54e3db7fe6dbd7e1838 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_TunnelTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_TunnelTask.cpp @@ -120,7 +120,7 @@ BOOL XEngine_TunnelTask_Handle(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in //非代理协议直接发送数据 XClient_TCPSelect_SendMsg(st_ProxyClient.hSocket, lpszMsgBuffer, nMsgLen); } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("Tunnel客户端:%s,创建隧道代理服务成功,连接到服务器:%s:%d"), lpszClientAddr, tszConnectAddr, nIPPort); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("Tunnel客户端:%s,创建隧道代理服务成功,连接到服务器:%s:%d,代理模式:%s"), lpszClientAddr, tszConnectAddr, nIPPort, bProxy ? "代理" : "直连"); } else { @@ -132,28 +132,26 @@ BOOL XEngine_TunnelTask_Handle(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in 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) { int nMsgLen = 4096; - if (!XClient_TCPSelect_RecvMsg(hSocket, tszMsgBuffer, &nMsgLen, FALSE)) + if (!XClient_TCPSelect_RecvMsg(hSocket, tszMsgBuffer, &nMsgLen)) { break; } - XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen, XENGINE_CLIENT_NETTYPE_TUNNEL); - } - //退出处理 - PROXYPROTOCOL_CLIENTINFO st_ProxyClient; - memset(&st_ProxyClient, '\0', sizeof(PROXYPROTOCOL_CLIENTINFO)); - if (ProxyProtocol_TunnelCore_GetInfo(lpszClientAddr, &st_ProxyClient)) - { - ProxyProtocol_TunnelCore_Delete(lpszClientAddr); - //是主动关闭的还是被动触发的 - if (!st_ProxyClient.bClose) + if (!XEngine_Network_Send(tszClientAddr, tszMsgBuffer, nMsgLen, XENGINE_CLIENT_NETTYPE_TUNNEL)) { - //主动关闭,需要调用 - XClient_TCPSelect_Close(hSocket); - XEngine_Network_Close(lpszClientAddr, XENGINE_CLIENT_NETTYPE_TUNNEL, XENGINE_CLIENT_CLOSE_SERVICE); + 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; } \ No newline at end of file