diff --git a/CHANGELOG b/CHANGELOG index b07e438904293924eb8c9c46fa2607082572c85d..86ef0f4ae80bf6a62c4c3276a39b846042a888b7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,15 @@ +XEngine_APIService V2.2.0.1001 + +添加:为p2p处理增加post方法 +添加:p2p协议模块解析和打包支持 +添加:帮助模块的p2p客户端 +修改:http参数名 + +added:post with p2pclient +added:p2p protocol parse and packet +added:p2p client for help module +modify:parament name +====================================================================================== XEngine_APIService V2.1.0.1001 添加:插件系统支持 diff --git a/README.en.md b/README.en.md index 26315a4b95597c5b0c69adf8c79ad6d55f9eb81d..019997a396c84e1c6820dcacc82c64fc0c95c37e 100644 --- a/README.en.md +++ b/README.en.md @@ -1,6 +1,7 @@ [中文](README.md) || [English](README.en.md) # XEngine_APIService This repository has a development and master branch. If you want to use it, please use the master branch +As long as the repository is not in suspended state, we will maintain and develop it all the time, please use it with confidence ## Introduction c c++ 接口服务器 @@ -30,9 +31,11 @@ and support plugin module 15. Exchange rate calculation (planned) 16. QR code generation and parse (planned) 17. Simplified and Traditional Conversion -18. Oil price inquiry (planned) -19. Twenty-four solar terms (planned) -20. Xinhua Dictionary +18. Twenty-four solar terms (planned) +19. Xinhua Dictionary +20. Metering Conversion +21. CDKey Creator (planned) +22. Distributed lock (planned) ## install diff --git a/README.md b/README.md index 32d087fd4204b385fec402bfa1a7b6d5b7f3c6c0..b85e417343b6beb48111545480f976b348912547 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ [中文](README.md) || [English](README.en.md) # XEngine_APIService 本仓库有开发和主分支,如果要使用,请使用master分支下的代码 +只要仓库不是在暂停状态,那么就会有人一直维护和开发,请放心使用 ## 介绍 c c++ 接口服务器 @@ -30,9 +31,11 @@ c c++ interface api service 15. 汇率计算(计划中) 16. 二维码生成解析(计划中) 17. 简繁转换 -18. 油价查询(计划中) -19. 二十四节气(计划中) -20. 新华词典 +18. 二十四节气(计划中) +19. 新华词典 +20. 计量转换(计划中) +21. CDKey创建支持(计划中) +22. 分布式锁API(计划中) ## 安装教程 diff --git a/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.cpp b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a086ddcb4ec60b24a8fb18b8dd38eb003e6437ae --- /dev/null +++ b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.cpp @@ -0,0 +1,158 @@ +#ifdef _MSC_BUILD +#include +#include +#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") +#pragma comment(lib,"XEngine_Core/XEngine_NetXApi") +#pragma comment(lib,"XEngine_NetHelp/NetHelp_APIHelp") +#pragma comment(lib,"Ws2_32") +#pragma comment(lib,"../../XEngine_Source/x64/Debug/jsoncpp") +#else +#include +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../XEngine_Source/XEngine_UserProtocol.h" + +//需要优先配置XEngine +//WINDOWS使用VS2022 x64 debug 编译 +//linux使用下面的命令编译 +//g++ -std=c++17 -Wall -g APPClient_P2PExample.cpp -o APPClient_P2PExample.exe -I ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_Core -L /usr/local/lib/XEngine_Release/XEngine_NetHelp -lXEngine_BaseLib -lXEngine_NetXApi -lNetHelp_APIHelp -ljsoncpp + +LPCTSTR lpszUserName = _T("123123aa"); +TCHAR tszPublicAddr[128]; +TCHAR tszPrivateAddr[128]; + +int nPort = 5103; +SOCKET m_hSocket; + +int APPClient_P2XPLogin() +{ + Json::Value st_JsonRoot; + LPCTSTR lpszAddr = _T("http://192.168.1.8:5501/api?function=p2p¶ms1=24577"); + ENUM_XENGINE_NETXAPI_SOCKET_CONNECTTYPE dwNetType; + + memset(tszPublicAddr, '\0', sizeof(tszPublicAddr)); + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + //获取网络连接类型 + if (!NetXApi_Socket_GetNetConnectType(&dwNetType)) + { + return -1; + } + int nListCount = 0; + NETXAPI_CARDINFO** ppSt_APICard; + NetXApi_Socket_GetCardInfo(&ppSt_APICard, &nListCount, AF_INET); + APIHelp_NetWork_GetIPNet(tszPublicAddr); + if (nListCount <= 0) + { + return -1; + } + //得到IP地址 + strcpy(tszPrivateAddr, ppSt_APICard[0]->tszIPAddr); + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_APICard, nListCount); + + st_JsonRoot["tszUserName"] = lpszUserName; + st_JsonRoot["tszPrivateAddr"] = tszPrivateAddr; + st_JsonRoot["tszPublicAddr"] = tszPublicAddr; + st_JsonRoot["dwConnectType"] = (Json::Value::UInt)dwNetType; + st_JsonRoot["dwPeerType"] = 0; + + int nMsgLen = 0; + int nHTTPCode = 0; + TCHAR* ptszMsgBuffer = NULL; + if (!APIHelp_HttpRequest_Post(lpszAddr, st_JsonRoot.toStyledString().c_str(), &nHTTPCode, &ptszMsgBuffer, &nMsgLen)) + { + return -1; + } + printf("APPClient_P2XPLogin,&nMsgLen:%d,%s\n", nMsgLen, ptszMsgBuffer); + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + return 0; +} + +int APPClient_P2XPList() +{ + Json::Value st_JsonRoot; + LPCTSTR lpszAddr = _T("http://192.168.1.8:5501/api?function=p2p¶ms1=24579"); + + st_JsonRoot["tszUserName"] = lpszUserName; + st_JsonRoot["tszPrivateAddr"] = tszPrivateAddr; + st_JsonRoot["tszPublicAddr"] = tszPublicAddr; + + int nMsgLen = 0; + int nHTTPCode = 0; + TCHAR* ptszMsgBuffer = NULL; + if (!APIHelp_HttpRequest_Post(lpszAddr, st_JsonRoot.toStyledString().c_str(), &nHTTPCode, &ptszMsgBuffer, &nMsgLen)) + { + return -1; + } + printf("APPClient_P2XPList,&nMsgLen:%d,%s\n", nMsgLen, ptszMsgBuffer); + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + return 0; +} + +int APPClient_P2XPGetUser() +{ + Json::Value st_JsonRoot; + LPCTSTR lpszAddr = _T("http://192.168.1.8:5501/api?function=p2p¶ms1=24583"); + + st_JsonRoot["tszUserName"] = lpszUserName; + st_JsonRoot["tszPrivateAddr"] = tszPrivateAddr; + st_JsonRoot["tszPublicAddr"] = tszPublicAddr; + + int nMsgLen = 0; + int nHTTPCode = 0; + TCHAR* ptszMsgBuffer = NULL; + if (!APIHelp_HttpRequest_Post(lpszAddr, st_JsonRoot.toStyledString().c_str(), &nHTTPCode, &ptszMsgBuffer, &nMsgLen)) + { + return -1; + } + printf("APPClient_P2XPGetUser,&nMsgLen:%d,%s\n", nMsgLen, ptszMsgBuffer); + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + return 0; +} + +int APPClient_P2XPConnect() +{ + Json::Value st_JsonRoot; + LPCTSTR lpszAddr = _T("http://192.168.1.8:5501/api?function=p2p¶ms1=24581"); + + st_JsonRoot["tszUserName"] = lpszUserName; + st_JsonRoot["tszPrivateAddr"] = tszPrivateAddr; + st_JsonRoot["tszPublicAddr"] = tszPublicAddr; + + int nMsgLen = 0; + int nHTTPCode = 0; + TCHAR* ptszMsgBuffer = NULL; + if (!APIHelp_HttpRequest_Post(lpszAddr, st_JsonRoot.toStyledString().c_str(), &nHTTPCode, &ptszMsgBuffer, &nMsgLen)) + { + return -1; + } + printf("APPClient_P2XPConnect,&nMsgLen:%d,%s\n", nMsgLen, ptszMsgBuffer); + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + return 0; +} + +int main() +{ +#ifdef _MSC_BUILD + WSADATA st_WSAData; + WSAStartup(MAKEWORD(2, 2), &st_WSAData); +#endif + + APPClient_P2XPLogin(); + APPClient_P2XPList(); + //APPClient_P2XPGetUser(); + //APPClient_P2XPConnect(); + +#ifdef _MSC_BUILD + WSACleanup(); +#endif + return 0; +} \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..ba0a1ba07fde3d0ba3280199cba9d819591cf411 --- /dev/null +++ b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj @@ -0,0 +1,143 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {d3c54afe-44f5-4d2f-b4c6-7b3f9faed95b} + APPClientP2PExample + 10.0 + + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + $(XEngine_Include);../../XEngine_Source/XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) + + + $(XEngine_Include);$(IncludePath) + $(XEngine_Lib32);$(LibraryPath) + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj.filters b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..178aff0684a38bedeca6ee0729ec0cff46800ca1 --- /dev/null +++ b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj.user b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj.user new file mode 100644 index 0000000000000000000000000000000000000000..88a550947edbc3c5003a41726f0749201fdb6822 --- /dev/null +++ b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/XEngine_APPClient/XEngine_APPClient.sln b/XEngine_APPClient/XEngine_APPClient.sln index d3e23727bce545cb9f77b87ac11568fbfa9cc112..2a351ea3f53dbe00de883d3e2b6353404d0bdaa9 100644 --- a/XEngine_APPClient/XEngine_APPClient.sln +++ b/XEngine_APPClient/XEngine_APPClient.sln @@ -15,6 +15,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_LanguageExample", EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_TranslationExample", "APPClient_TranslationExample\APPClient_TranslationExample.vcxproj", "{B98E33E1-7128-4E04-A328-70665C01CF34}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_P2PExample", "APPClient_P2PExample\APPClient_P2PExample.vcxproj", "{D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -71,6 +73,14 @@ Global {B98E33E1-7128-4E04-A328-70665C01CF34}.Release|x64.Build.0 = Release|x64 {B98E33E1-7128-4E04-A328-70665C01CF34}.Release|x86.ActiveCfg = Release|Win32 {B98E33E1-7128-4E04-A328-70665C01CF34}.Release|x86.Build.0 = Release|Win32 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Debug|x64.ActiveCfg = Debug|x64 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Debug|x64.Build.0 = Debug|x64 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Debug|x86.ActiveCfg = Debug|Win32 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Debug|x86.Build.0 = Debug|Win32 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Release|x64.ActiveCfg = Release|x64 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Release|x64.Build.0 = Release|x64 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Release|x86.ActiveCfg = Release|Win32 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index f0303dd65b4e47af78242ada2f320e18054355d2..9df27402a71b203c6ee70fd1284a7f9f9d7540d4 100644 Binary files a/XEngine_Docment/Docment_en.docx and b/XEngine_Docment/Docment_en.docx differ diff --git a/XEngine_Docment/Docment_zh.docx b/XEngine_Docment/Docment_zh.docx index fe37afdc17485677927d5add2480894119599e61..2cecdb6653267210511b78731fd4e5f7104177cd 100644 Binary files a/XEngine_Docment/Docment_zh.docx and b/XEngine_Docment/Docment_zh.docx differ diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index e4d2d08da1d2d63af21ed389575a287dc692d62d..831e3045b8d00c9ed1d34261e877e45358eaf1ec 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -10,7 +10,8 @@ }, "XTime":{ "nTimeCheck":3, - "nHttpTimeOut":5 + "nHttpTimeOut":5, + "nP2PTimeOut":60 }, "XLog":{ "MaxSize":1024000, @@ -30,6 +31,7 @@ "tszPluginFile":"./XEngine_Config/XEngine_PluginConfig.json" }, "XVer":[ + "2.2.0.1001 Build20220701", "2.1.0.1001 Build20220429", "1.1.0.1001 Build20220402", "1.0.0.1001 Build20220311" diff --git a/XEngine_Source/VSClean.bat b/XEngine_Source/VSClean.bat index bf8eca312f152fb046525e2cb0588095fec84b08..d2cff7562abc76dd9a4eb8a91a27aba3800f91e0 100644 --- a/XEngine_Source/VSClean.bat +++ b/XEngine_Source/VSClean.bat @@ -1,5 +1,5 @@ @echo Off -del /s /a *.ncb *.so *.o *.db +del /s /a *.ncb *.o *.db FOR /R . %%d IN (.) DO rd /s /q "%%d\Debug" 2>nul FOR /R . %%d IN (.) DO rd /s /q "%%d\Release" 2>nul FOR /R . %%d IN (.) DO rd /s /q "%%d\x64" 2>nul diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h index cf64d3920a2234ede58c040055f97f8e1bb28d7d..29bb4d858791aa2ef7b5f89ba6709f3b1af2cc06 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h @@ -18,20 +18,18 @@ typedef struct TCHAR tszIPAddr[128]; //本机IP地址,根据需要配置 BOOL bDeamon; //是否以守护进程启动,LINUX有效 int nHttpPort; //HTTP服务端口 - int nCenterPort; //业务端口 struct { int nMaxClient; //最大客户端个数 int nMaxQueue; //最大队列个数 int nIOThread; //网络IO线程数 int nHTTPThread; //HTTP任务处理线程数 - int nCenterThread; //业务任务处理线程数 }st_XMax; struct { int nTimeCheck; //检测次数 int nHTTPTimeOut; //HTTP超时时间 - int nCenterTimeOut; //业务超时时间 + int nP2PTimeOut; //P2P客户端超时时间 }st_XTime; //次数*时间=超时 struct { diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index 7faf991e76f1bcbbc3e11f9c576a6b5fbc35d27c..b9cbb551fbcf7f5fd2eff867507054192a6f7b8f 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -97,7 +97,7 @@ BOOL CModuleConfigure_Json::ModuleConfigure_Json_File(LPCTSTR lpszConfigFile, XE pSt_ServerConfig->st_XMax.nIOThread = st_JsonXMax["nIOThread"].asInt(); pSt_ServerConfig->st_XMax.nHTTPThread = st_JsonXMax["nHttpThread"].asInt(); - if (st_JsonRoot["XTime"].empty() || (2 != st_JsonRoot["XTime"].size())) + if (st_JsonRoot["XTime"].empty() || (3 != st_JsonRoot["XTime"].size())) { Config_IsErrorOccur = TRUE; Config_dwErrorCode = ERROR_MODULE_CONFIGURE_JSON_XTIME; @@ -106,6 +106,7 @@ BOOL CModuleConfigure_Json::ModuleConfigure_Json_File(LPCTSTR lpszConfigFile, XE Json::Value st_JsonXTime = st_JsonRoot["XTime"]; pSt_ServerConfig->st_XTime.nTimeCheck = st_JsonXTime["nTimeCheck"].asInt(); pSt_ServerConfig->st_XTime.nHTTPTimeOut = st_JsonXTime["nHttpTimeOut"].asInt(); + pSt_ServerConfig->st_XTime.nP2PTimeOut = st_JsonXTime["nP2PTimeOut"].asInt(); if (st_JsonRoot["XLog"].empty() || (3 != st_JsonRoot["XLog"].size())) { diff --git a/XEngine_Source/XEngine_ModuleHelp/Makefile b/XEngine_Source/XEngine_ModuleHelp/Makefile index d39d96f44a03284ad0c6edc54602e3f7bb4df091..93b5d4a0bf9122c28198a873143a67ec45120283 100644 --- a/XEngine_Source/XEngine_ModuleHelp/Makefile +++ b/XEngine_Source/XEngine_ModuleHelp/Makefile @@ -2,11 +2,11 @@ CC = g++ -Wall -std=c++17 -fPIC RELEASE = 0 UNICODE = 0 INCLUDE = -I ./ -I ../XEngine_ThirdPart/opencc/include -LOADBIN = -L ../XEngine_ThirdPart/opencc/ubuntu -LIB = -lopencc +LOADBIN = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L ../XEngine_ThirdPart/opencc/ubuntu +LIB = -lXEngine_BaseLib -lopencc LIBEX = -static-libgcc -lrt -ldl -lpthread LOADSO = -Wl,-rpath=./,--disable-new-dtags -LIBINCLUDE = ModuleHelp_IDCard.o ModuleHelp_Language.o pch.o +LIBINCLUDE = ModuleHelp_IDCard.o ModuleHelp_Language.o ModuleHelp_P2PClient.o pch.o ifeq ($(RELEASE),1) FLAGS = -c -O2 @@ -30,6 +30,8 @@ ModuleHelp_IDCard.o:./ModuleHelp_IDCard/ModuleHelp_IDCard.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./ModuleHelp_IDCard/ModuleHelp_IDCard.cpp ModuleHelp_Language.o:./ModuleHelp_Language/ModuleHelp_Language.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./ModuleHelp_Language/ModuleHelp_Language.cpp +ModuleHelp_P2PClient.o:./ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp pch.o:./pch.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./pch.cpp diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h index 65818bfc8e3b770c3b24497789f10b2a73107ce1..59cf06fcb9a607c4d0a91b46368f68027a96ba99 100644 --- a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h @@ -11,6 +11,29 @@ // History: *********************************************************************/ ////////////////////////////////////////////////////////////////////////// +// 导出回调函数 +////////////////////////////////////////////////////////////////////////// +typedef void(CALLBACK* CALLBACK_APISERVICE_MODULE_HELP_P2PCLIENT)(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, LPVOID lParam); +////////////////////////////////////////////////////////////////////////// +// 导出数据结构 +////////////////////////////////////////////////////////////////////////// +//计时器 +typedef struct +{ + __int64x dwUserTime; //用户存在时间 + __int64x dwPacketTime; //包时间,拿到包后的存活时间 + __int64x dwKeepAlive; //保活计时器时间,经过网络时间 + unsigned short int usTTL : 1; //路由数 +}P2XP_TIMER_INFOMATION, * LPP2XP_TIMER_INFOMATION; +//一个节点信息 +typedef struct +{ + XENGINE_P2XPPEER_PROTOCOL st_PeerAddr; //P2P通信的时候使用的地址(客户方使用) + P2XP_TIMER_INFOMATION st_PeerTimer; //节点时间信息 + XENGINE_IPADDRINFO st_IPAddrInfo; //IP地址信息 + BOOL bIsLogin; +}XENGINE_P2XP_PEERINFO, * LPNETENGINE_P2XP_PEERINFO; +////////////////////////////////////////////////////////////////////////// /// 导出的函数 ////////////////////////////////////////////////////////////////////////// extern "C" DWORD ModuleHelp_GetLastError(int *pInt_SysError = NULL); @@ -90,4 +113,177 @@ extern "C" BOOL ModuleHelp_Language_ConvertZh(LPCTSTR lpszJsonFile, LPCTSTR lpsz 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL ModuleHelp_Translation_Convert(ENUM_XENGINE_APISERVICE_TRANSLATION_TYPE enTranslationType, TCHAR* ptszTranslationType); \ No newline at end of file +extern "C" BOOL ModuleHelp_Translation_Convert(ENUM_XENGINE_APISERVICE_TRANSLATION_TYPE enTranslationType, TCHAR* ptszTranslationType); +/************************************************************************/ +/* 节点管理器导出函数 */ +/************************************************************************/ +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Init +函数功能:初始化P2P客户端 + 参数.一:nTimeout + In/Out:In + 类型:整数型 + 可空:N + 意思:输入超时时间,秒 + 参数.二:fpCall_P2PClient + In/Out:In/Out + 类型:回调函数 + 可空:N + 意思:P2P客户端导出信息 + 参数.三:lParam + In/Out:In/Out + 类型:无类型指针 + 可空:Y + 意思:回调函数自定义参数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Init(int nTimeout, CALLBACK_APISERVICE_MODULE_HELP_P2PCLIENT fpCall_P2PClient, LPVOID lParam = NULL); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Destory +函数功能:销毁 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Destory(); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Add +函数功能:添加一个客户到一个节点信息 + 参数.一:pSt_PeerInfo + In/Out:In + 类型:结构体指针 + 可空:N + 意思:要添加的节点信息 +返回值 + 类型:逻辑型 + 意思:是否添加成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO * pSt_PeerInfo); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Get +函数功能:获取P2P节点对应信息 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要查询的地址 + 参数.二:pSt_PeerInfo + In/Out:Out + 类型:数据结构指针 + 可空:Y + 意思:如果为空将不导出对应的数据 +返回值 + 类型:逻辑型 + 意思:是否查找成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol, XENGINE_P2XP_PEERINFO * pSt_PeerInfo = NULL); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_GetLan +函数功能:获取局域网IP地址列表 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要查找地址信息 + 参数.二:pppSt_P2XPClient + In/Out:Out + 类型:三级指针 + 可空:N + 意思:导出局域网IP地址列表 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出地址列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注:参数二需要调用基础库的BaseLib_OperatorMemory_Free函数进行内存释放 +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol, XENGINE_P2XPPEER_PROTOCOL * **pppSt_P2XPClient, int* pInt_ListCount); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_GetLList +函数功能:获取同一公网下所有局域网主IP列表 + 参数.一:lpszPubAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要获取的IP地址 + 参数.二:pppszP2XPClient + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出内网主IP地址列表 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注:参数二需要调用基础库的BaseLib_OperatorMemory_Free函数进行内存释放 +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_GetLList(LPCSTR lpszPubAddr, CHAR * **pppszP2XPClient, int* pInt_ListCount); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_GetWList +函数功能:获取所有连接到的公网地址列表 + 参数.一:pppszP2XPClient + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出地址列表 + 参数.二:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_GetWList(CHAR * **pppszP2XPClient, int* pInt_ListCount); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Delete +函数功能:删除一个指定的节点 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要删除的节点地址 +返回值 + 类型:逻辑型 + 意思:是否成功删除 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_DelAll +函数功能:清空节点列表数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_DelAll(); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Heart +函数功能:触发一次心跳 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要操作的节点地址 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Heart(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h index fd954523ed2dd99f696d0c134411a70b1daf44f1..cd907531d47c501cebe6f0186b1c7f9c7b6c89a6 100644 --- a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h @@ -21,4 +21,15 @@ ////////////////////////////////////////////////////////////////////////// #define ERROR_XENGINE_APISERVICE_MODULE_HELP_LANGUAGE_PARAMENT 0xD1001 //参数错误 #define ERROR_XENGINE_APISERVICE_MODULE_HELP_LANGUAGE_FAILED 0xD1002 //处理失败 -#define ERROR_XENGINE_APISERVICE_MODULE_HELP_LANGUAGE_NOTSUPPORT 0xD1003 //不支持的类型 \ No newline at end of file +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_LANGUAGE_NOTSUPPORT 0xD1003 //不支持的类型 +////////////////////////////////////////////////////////////////////////// +// 节点管理器错误 +////////////////////////////////////////////////////////////////////////// +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_ISEXIST 0xB0E0001 //用户已经存在 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_MALLOC 0xB0E0002 //申请内存失败 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT 0xB0E0003 //获取用户信息失败,参数错误 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND 0xB0E0004 //没有找到用户 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPUBADDRR 0xB0E0005 //公网IP地址没有找到 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPRIADDR 0xB0E0006 //私有网络IP地址没有找到 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOLIST 0xB0E0007 //没有数据存在 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_THREAD 0xB0E0008 //创建线程失败 \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp new file mode 100644 index 0000000000000000000000000000000000000000..058a81f30c49053b80d2f041f55edfd0f08257b2 --- /dev/null +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp @@ -0,0 +1,618 @@ +#include "pch.h" +#include "ModuleHelp_P2PClient.h" +/******************************************************************** +// Created: 2022/06/13 16:56:32 +// File Name: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_P2PClient\ModuleHelp_P2PClient.cpp +// File Path: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_P2PClient +// File Base: ModuleHelp_P2PClient +// File Ext: cpp +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: P2P客户端管理器 +// History: +*********************************************************************/ +CModuleHelp_P2PClient::CModuleHelp_P2PClient() +{ +} +CModuleHelp_P2PClient::~CModuleHelp_P2PClient() +{ +} +////////////////////////////////////////////////////////////////////////// +// 公有函数 +////////////////////////////////////////////////////////////////////////// +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Init +函数功能:初始化P2P客户端 + 参数.一:nTimeout + In/Out:In + 类型:整数型 + 可空:N + 意思:输入超时时间,秒 + 参数.二:fpCall_P2PClient + In/Out:In/Out + 类型:回调函数 + 可空:N + 意思:P2P客户端导出信息 + 参数.三:lParam + In/Out:In/Out + 类型:无类型指针 + 可空:Y + 意思:回调函数自定义参数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Init(int nTimeout, CALLBACK_APISERVICE_MODULE_HELP_P2PCLIENT fpCall_P2PClient, LPVOID lParam /* = NULL */) +{ + ModuleHelp_IsErrorOccur = FALSE; + + m_bIsRun = TRUE; + m_nTimeout = nTimeout; + m_lParam = lParam; + lpCall_P2PClient = fpCall_P2PClient; + + pSTDThread = make_shared(ModuleHelp_P2PClient_Thread, this); + if (NULL == pSTDThread) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_THREAD; + return FALSE; + } + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Destory +函数功能:销毁 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Destory() +{ + ModuleHelp_IsErrorOccur = FALSE; + + if (m_bIsRun) + { + m_bIsRun = FALSE; + if (pSTDThread->joinable()) + { + pSTDThread->join(); + } + } + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Add +函数功能:添加一个客户到一个节点信息 + 参数.一:pSt_PeerInfo + In/Out:In + 类型:结构体指针 + 可空:N + 意思:要添加的节点信息 +返回值 + 类型:逻辑型 + 意思:是否添加成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO* pSt_PeerInfo) +{ + ModuleHelp_IsErrorOccur = FALSE; + + st_Locker.lock(); + unordered_map > >::iterator stl_MapIteratorAddr = stl_MapClients.find(pSt_PeerInfo->st_PeerAddr.tszPublicAddr); + if (stl_MapIteratorAddr == stl_MapClients.end()) + { + //没有找到,一个一个加入,首先加入私有同步网络 + unordered_map stl_MapPrivate; + stl_MapPrivate.insert(make_pair(pSt_PeerInfo->st_PeerAddr.tszConnectAddr, *pSt_PeerInfo)); + //获取私有网络的路由地址 + XENGINE_LIBADDR st_LibAddr; + TCHAR tszPrivateAddr[64]; + + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + if (!BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_PeerInfo->st_PeerAddr.tszPrivateAddr, &st_LibAddr)) + { + //没有内网地址不加入. + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = BaseLib_GetLastError(); + return FALSE; + } + _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + //然后加入到私网地址 + unordered_map > stl_MapPriAddr; + stl_MapPriAddr.insert(make_pair(tszPrivateAddr, stl_MapPrivate)); + //加入公网 + stl_MapClients.insert(make_pair(pSt_PeerInfo->st_PeerAddr.tszPublicAddr, stl_MapPriAddr)); + } + else + { + //找到了这个公网的地址 + XENGINE_LIBADDR st_LibAddr; + TCHAR tszPrivateAddr[64]; + + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + //获取私有网络的路由地址 + if (!BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_PeerInfo->st_PeerAddr.tszPrivateAddr, &st_LibAddr)) + { + //没有内网地址不加入. + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = BaseLib_GetLastError(); + return FALSE; + } + //内网地址192.168.1.2 内网出口192.168.1.1 链接地址10.0.1.0:13444 + _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + unordered_map >::iterator stl_MapPriIteartor = stl_MapIteratorAddr->second.find(tszPrivateAddr); + if (stl_MapPriIteartor == stl_MapIteratorAddr->second.end()) + { + //没有私网地址 + unordered_map stl_MapPrivate; + stl_MapPrivate.insert(make_pair(pSt_PeerInfo->st_PeerAddr.tszConnectAddr, *pSt_PeerInfo)); + + stl_MapIteratorAddr->second.insert(make_pair(tszPrivateAddr, stl_MapPrivate)); + } + else + { + //查找链接地址是否存在.存在表示已经加入过了,那么就什么都不做 + unordered_map::iterator stl_MapConnIterator = stl_MapPriIteartor->second.find(pSt_PeerInfo->st_PeerAddr.tszConnectAddr); + if (stl_MapConnIterator == stl_MapPriIteartor->second.find(pSt_PeerInfo->st_PeerAddr.tszConnectAddr)) + { + //没有找到就加入 + stl_MapPriIteartor->second.insert(make_pair(pSt_PeerInfo->st_PeerAddr.tszConnectAddr, *pSt_PeerInfo)); + } + } + } + st_Locker.unlock(); + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Get +函数功能:获取P2P节点对应信息 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要查询的地址 + 参数.二:pSt_PeerInfo + In/Out:Out + 类型:数据结构指针 + 可空:Y + 意思:如果为空将不导出对应的数据 +返回值 + 类型:逻辑型 + 意思:是否查找成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL *pSt_P2PProtocol, XENGINE_P2XP_PEERINFO* pSt_PeerInfo /* = NULL */) +{ + ModuleHelp_IsErrorOccur = FALSE; + + if (NULL == pSt_P2PProtocol) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT; + return FALSE; + } + //查找元素 + st_Locker.lock_shared(); + unordered_map > >::const_iterator stl_MapPubIterator = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); + if (stl_MapPubIterator == stl_MapClients.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + //转换地址 + XENGINE_LIBADDR st_LibAddr; + TCHAR tszPrivateAddr[64]; + + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + //获取私有网络的路由地址 + BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_P2PProtocol->tszPrivateAddr, &st_LibAddr); + _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + + unordered_map >::const_iterator stl_MapPriIterator = stl_MapPubIterator->second.find(tszPrivateAddr); + if (stl_MapPriIterator == stl_MapPubIterator->second.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + unordered_map::const_iterator stl_MapConnIterator = stl_MapPriIterator->second.find(pSt_P2PProtocol->tszConnectAddr); + if (stl_MapConnIterator == stl_MapPriIterator->second.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + //判断是否导出节点信息 + if (NULL != pSt_PeerInfo) + { + *pSt_PeerInfo = stl_MapConnIterator->second; + } + st_Locker.unlock_shared(); + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_GetLan +函数功能:获取局域网IP地址列表 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要查找地址信息 + 参数.二:pppSt_P2XPClient + In/Out:Out + 类型:三级指针 + 可空:N + 意思:导出局域网IP地址列表 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出地址列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注:参数二需要调用基础库的BaseLib_OperatorMemory_Free函数进行内存释放 +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, XENGINE_P2XPPEER_PROTOCOL*** pppSt_P2XPClient, int* pInt_ListCount) +{ + ModuleHelp_IsErrorOccur = FALSE; + + if ((NULL == pSt_P2PProtocol) || (NULL == pppSt_P2XPClient) || (NULL == pInt_ListCount)) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT; + return FALSE; + } + //查找公网IP地址 + st_Locker.lock_shared(); + unordered_map > >::const_iterator stl_MapPubIterator = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); + if (stl_MapPubIterator == stl_MapClients.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPUBADDRR; + st_Locker.unlock_shared(); + return FALSE; + } + XENGINE_LIBADDR st_LibAddr; + TCHAR tszPrivateAddr[64]; + + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + //如果输入的是192.168.1.1 IP,就我们自己分割,否则认为输入的是 192.168.1 + if (BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_P2PProtocol->tszPrivateAddr, &st_LibAddr)) + { + _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + unordered_map >::const_iterator stl_MapPriIterator = stl_MapPubIterator->second.find(tszPrivateAddr); + if (stl_MapPriIterator == stl_MapPubIterator->second.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPRIADDR; + st_Locker.unlock_shared(); + return FALSE; + } + if (stl_MapPriIterator->second.empty()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOLIST; + st_Locker.unlock_shared(); + return FALSE; + } + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_P2XPClient, stl_MapPriIterator->second.size(), sizeof(XENGINE_P2XPPEER_PROTOCOL)); + unordered_map::const_iterator stl_MapConnIterator = stl_MapPriIterator->second.begin(); + for (int i = 0; stl_MapConnIterator != stl_MapPriIterator->second.end(); stl_MapConnIterator++, i++) + { + *(*pppSt_P2XPClient)[i] = stl_MapConnIterator->second.st_PeerAddr; + } + *pInt_ListCount = stl_MapPriIterator->second.size(); + } + else + { + unordered_map >::const_iterator stl_MapPriIterator = stl_MapPubIterator->second.find(pSt_P2PProtocol->tszPrivateAddr); + if (stl_MapPriIterator == stl_MapPubIterator->second.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPRIADDR; + st_Locker.unlock_shared(); + return FALSE; + } + if (stl_MapPriIterator->second.empty()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOLIST; + st_Locker.unlock_shared(); + return FALSE; + } + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_P2XPClient, stl_MapPriIterator->second.size(), sizeof(XENGINE_P2XPPEER_PROTOCOL)); + unordered_map::const_iterator stl_MapConnIterator = stl_MapPriIterator->second.begin(); + for (int i = 0; stl_MapConnIterator != stl_MapPriIterator->second.end(); stl_MapConnIterator++, i++) + { + *(*pppSt_P2XPClient)[i] = stl_MapConnIterator->second.st_PeerAddr; + } + *pInt_ListCount = stl_MapPriIterator->second.size(); + } + st_Locker.unlock_shared(); + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_GetLList +函数功能:获取同一公网下所有局域网主IP列表 + 参数.一:lpszPubAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要获取的IP地址 + 参数.二:pppszP2XPClient + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出内网主IP地址列表 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注:参数二需要调用基础库的BaseLib_OperatorMemory_Free函数进行内存释放 +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_GetLList(LPCTSTR lpszPubAddr, TCHAR*** pppszP2XPClient, int* pInt_ListCount) +{ + ModuleHelp_IsErrorOccur = FALSE; + + if ((NULL == lpszPubAddr) || (NULL == pppszP2XPClient) || (NULL == pInt_ListCount)) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT; + return FALSE; + } + st_Locker.lock_shared(); + unordered_map > >::const_iterator stl_MapPubIterator = stl_MapClients.find(lpszPubAddr); + if (stl_MapPubIterator == stl_MapClients.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppszP2XPClient, stl_MapPubIterator->second.size(), 128); + unordered_map >::const_iterator stl_MapPriIterator = stl_MapPubIterator->second.begin(); + for (int i = 0; stl_MapPriIterator != stl_MapPubIterator->second.end(); stl_MapPriIterator++, i++) + { + _tcscpy((*pppszP2XPClient)[i], stl_MapPriIterator->first.c_str()); + } + *pInt_ListCount = stl_MapPubIterator->second.size(); + st_Locker.unlock_shared(); + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_GetWList +函数功能:获取所有连接到的公网地址列表 + 参数.一:pppszP2XPClient + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出地址列表 + 参数.二:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_GetWList(TCHAR*** pppszP2XPClient, int* pInt_ListCount) +{ + ModuleHelp_IsErrorOccur = FALSE; + + if ((NULL == pppszP2XPClient) || (NULL == pInt_ListCount)) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT; + return FALSE; + } + if (stl_MapClients.size() <= 0) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + return FALSE; + } + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppszP2XPClient, stl_MapClients.size(), 128); + + st_Locker.lock_shared(); + unordered_map > >::const_iterator stl_MapIterator = stl_MapClients.begin(); + for (int i = 0; stl_MapIterator != stl_MapClients.end(); stl_MapIterator++, i++) + { + _tcscpy((*pppszP2XPClient)[i], stl_MapIterator->first.c_str()); + } + *pInt_ListCount = stl_MapClients.size(); + st_Locker.unlock_shared(); + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Delete +函数功能:删除一个指定的节点 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要删除的节点地址 +返回值 + 类型:逻辑型 + 意思:是否成功删除 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol) +{ + ModuleHelp_IsErrorOccur = FALSE; + //查找公网地址 + unordered_map > >::iterator stl_MapPubIteartor = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); + if (stl_MapPubIteartor != stl_MapClients.end()) + { + XENGINE_LIBADDR st_LibAddr; + TCHAR tszPrivateAddr[64]; + + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + if (BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_P2PProtocol->tszPrivateAddr, &st_LibAddr)) + { + _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + //查找私有路由地址 + unordered_map >::iterator stl_MapPriIterator = stl_MapPubIteartor->second.find(tszPrivateAddr); + if (stl_MapPriIterator != stl_MapPubIteartor->second.end()) + { + //查找局域网自身的IP地址是否存在 + unordered_map::iterator stl_MapConnIterator = stl_MapPriIterator->second.find(pSt_P2PProtocol->tszConnectAddr); + if (stl_MapConnIterator != stl_MapPriIterator->second.end()) + { + //找到了删除 + stl_MapPriIterator->second.erase(stl_MapConnIterator); + } + if (stl_MapPriIterator->second.empty()) + { + //如果这个私有网络列表为空,那么就清楚他 + stl_MapPubIteartor->second.erase(stl_MapPriIterator); + } + } + } + if (stl_MapPubIteartor->second.empty()) + { + stl_MapClients.erase(stl_MapPubIteartor); //如果这个公有网络IP地址列表为空,那么就删除他. + } + } + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_DelAll +函数功能:清空节点列表数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_DelAll() +{ + ModuleHelp_IsErrorOccur = FALSE; + + st_Locker.lock(); + stl_MapClients.clear(); + st_Locker.unlock(); + + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Heart +函数功能:触发一次心跳 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要操作的节点地址 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Heart(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol) +{ + ModuleHelp_IsErrorOccur = FALSE; + + if (NULL == pSt_P2PProtocol) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT; + return FALSE; + } + //查找元素 + st_Locker.lock_shared(); + unordered_map > >::iterator stl_MapPubIterator = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); + if (stl_MapPubIterator == stl_MapClients.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + //转换地址 + XENGINE_LIBADDR st_LibAddr; + TCHAR tszPrivateAddr[64]; + + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + //获取私有网络的路由地址 + BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_P2PProtocol->tszPrivateAddr, &st_LibAddr); + _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + + unordered_map >::iterator stl_MapPriIterator = stl_MapPubIterator->second.find(tszPrivateAddr); + if (stl_MapPriIterator == stl_MapPubIterator->second.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + unordered_map::iterator stl_MapConnIterator = stl_MapPriIterator->second.find(pSt_P2PProtocol->tszConnectAddr); + if (stl_MapConnIterator == stl_MapPriIterator->second.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + stl_MapConnIterator->second.st_PeerTimer.dwUserTime = time(NULL); + st_Locker.unlock_shared(); + return TRUE; +} +////////////////////////////////////////////////////////////////////////// +// 保护函数 +////////////////////////////////////////////////////////////////////////// +XHTHREAD CALLBACK CModuleHelp_P2PClient::ModuleHelp_P2PClient_Thread(LPVOID lParam) +{ + CModuleHelp_P2PClient* pClass_This = (CModuleHelp_P2PClient*)lParam; + list stl_ListRemove; + + while (pClass_This->m_bIsRun) + { + pClass_This->st_Locker.lock_shared(); + //公网轮训 + for (unordered_map > >::iterator stl_MapPubIterator = pClass_This->stl_MapClients.begin(); stl_MapPubIterator != pClass_This->stl_MapClients.end(); stl_MapPubIterator++) + { + //内网轮训 + for (unordered_map >::iterator stl_MapPriIterator = stl_MapPubIterator->second.begin(); stl_MapPriIterator != stl_MapPubIterator->second.end(); stl_MapPriIterator++) + { + //连接地址 + for (unordered_map::iterator stl_MapConnIterator = stl_MapPriIterator->second.begin(); stl_MapConnIterator != stl_MapPriIterator->second.end(); stl_MapConnIterator++) + { + //是否超时 + time_t nTimeEnd = time(NULL); + if ((nTimeEnd - stl_MapConnIterator->second.st_PeerTimer.dwUserTime) > pClass_This->m_nTimeout) + { + stl_ListRemove.push_back(stl_MapConnIterator->second); + } + } + } + } + pClass_This->st_Locker.unlock_shared(); + + for (auto stl_ListIterator = stl_ListRemove.begin(); stl_ListIterator != stl_ListRemove.end(); stl_ListIterator++) + { + pClass_This->ModuleHelp_P2PClient_Delete((XENGINE_P2XPPEER_PROTOCOL*) & stl_ListIterator); + pClass_This->lpCall_P2PClient((XENGINE_P2XPPEER_PROTOCOL*)&stl_ListIterator, pClass_This->m_lParam); + } + stl_ListRemove.clear(); + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + return 0; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h new file mode 100644 index 0000000000000000000000000000000000000000..f2ba48ae1071781a16b578ce98e4799488dbc329 --- /dev/null +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h @@ -0,0 +1,43 @@ +#pragma once +/******************************************************************** +// Created: 2022/06/13 16:55:53 +// File Name: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_P2PClient\ModuleHelp_P2PClient.h +// File Path: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_P2PClient +// File Base: ModuleHelp_P2PClient +// File Ext: h +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: P2P客户端管理器 +// History: +*********************************************************************/ +class CModuleHelp_P2PClient +{ +public: + CModuleHelp_P2PClient(); + ~CModuleHelp_P2PClient(); +public: + BOOL ModuleHelp_P2PClient_Init(int nTimeout, CALLBACK_APISERVICE_MODULE_HELP_P2PCLIENT fpCall_P2PClient, LPVOID lParam = NULL); + BOOL ModuleHelp_P2PClient_Destory(); + BOOL ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO* pSt_PeerInfo); + BOOL ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, XENGINE_P2XP_PEERINFO* pSt_PeerInfo = NULL); + BOOL ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, XENGINE_P2XPPEER_PROTOCOL*** pppSt_P2XPClient, int* pInt_ListCount); + BOOL ModuleHelp_P2PClient_GetLList(LPCTSTR lpszPubAddr, TCHAR*** pppszP2XPClient, int* pInt_ListCount); + BOOL ModuleHelp_P2PClient_GetWList(TCHAR*** pppszP2XPClient, int* pInt_ListCount); + BOOL ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol); + BOOL ModuleHelp_P2PClient_DelAll(); + BOOL ModuleHelp_P2PClient_Heart(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol); +protected: + static XHTHREAD CALLBACK ModuleHelp_P2PClient_Thread(LPVOID lParam); +private: + BOOL m_bIsRun; + int m_nTimeout; + LPVOID m_lParam; + CALLBACK_APISERVICE_MODULE_HELP_P2PCLIENT lpCall_P2PClient; +private: + shared_mutex st_Locker; +private: + shared_ptr pSTDThread; +private: + //接口:公网 内网 连接. + unordered_map > > stl_MapClients; +}; diff --git a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def index ea9669296988fa3e9ee558a6173f567e886ee590..328452852b99f6ab340abf7d834fdbe45ae15e8b 100644 --- a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def +++ b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def @@ -7,4 +7,15 @@ EXPORTS ModuleHelp_IDCard_CheckSum ModuleHelp_Language_ConvertZh - ModuleHelp_Translation_Convert \ No newline at end of file + ModuleHelp_Translation_Convert + + ModuleHelp_P2PClient_Init + ModuleHelp_P2PClient_Destory + ModuleHelp_P2PClient_Add + ModuleHelp_P2PClient_Get + ModuleHelp_P2PClient_GetLan + ModuleHelp_P2PClient_GetLList + ModuleHelp_P2PClient_GetWList + ModuleHelp_P2PClient_Delete + ModuleHelp_P2PClient_DelAll + ModuleHelp_P2PClient_Heart \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj index fc8326db7bed071f68da79bb2d53dcf53866f86c..482b508b51c90233c6e0d43cb7b7d2df64812d5e 100644 --- a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj +++ b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj @@ -73,18 +73,22 @@ true $(XEngine_Include);../XEngine_ThirdPart/opencc/include;$(IncludePath) + $(XEngine_Lib32);$(LibraryPath) false $(XEngine_Include);../XEngine_ThirdPart/opencc/include;$(IncludePath) + $(XEngine_Lib32);$(LibraryPath) true $(XEngine_Include);../XEngine_ThirdPart/opencc/include;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) false $(XEngine_Include);../XEngine_ThirdPart/opencc/include;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) @@ -164,12 +168,14 @@ + + Create Create diff --git a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj.filters b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj.filters index e7d2db5b261c1c4866f21b869a1f771cedb2d99d..d8282e6f5e5b7673da0d1c8dfd96571c9e044f59 100644 --- a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj.filters +++ b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj.filters @@ -25,6 +25,12 @@ {47b05cf6-fe24-43df-8860-e291baa7ffbb} + + {65195020-af5e-4083-804d-288f2ce618ec} + + + {2b552f75-e436-45a8-ba71-e398eeb4a68a} + @@ -45,6 +51,9 @@ 头文件\ModuleHelp_Language + + 头文件\ModuleHelp_P2PClient + @@ -59,6 +68,9 @@ 源文件\ModuleHelp_Language + + 源文件\ModuleHelp_P2PClient + diff --git a/XEngine_Source/XEngine_ModuleHelp/pch.cpp b/XEngine_Source/XEngine_ModuleHelp/pch.cpp index 23dc3ac01476a74a415fc7b8123781fbb373665e..b6953669933f605439fcffce32ec9f3e5e97d22b 100644 --- a/XEngine_Source/XEngine_ModuleHelp/pch.cpp +++ b/XEngine_Source/XEngine_ModuleHelp/pch.cpp @@ -1,6 +1,7 @@ #include "pch.h" #include "ModuleHelp_IDCard/ModuleHelp_IDCard.h" #include "ModuleHelp_Language/ModuleHelp_Language.h" +#include "ModuleHelp_P2PClient/ModuleHelp_P2PClient.h" /******************************************************************** // Created: 2022/03/04 13:37:38 // File Name: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\pch.cpp @@ -17,6 +18,7 @@ DWORD ModuleHelp_dwErrorCode = 0; ////////////////////////////////////////////////////////////////////////// CModuleHelp_IDCard m_IDCard; CModuleHelp_Language m_Language; +CModuleHelp_P2PClient m_P2PClient; ////////////////////////////////////////////////////////////////////////// /// 导出的函数 ////////////////////////////////////////////////////////////////////////// @@ -49,4 +51,47 @@ extern "C" BOOL ModuleHelp_Language_ConvertZh(LPCTSTR lpszJsonFile, LPCTSTR lpsz extern "C" BOOL ModuleHelp_Translation_Convert(ENUM_XENGINE_APISERVICE_TRANSLATION_TYPE enTranslationType, TCHAR * ptszTranslationType) { return m_Language.ModuleHelp_Translation_Convert(enTranslationType, ptszTranslationType); +} +/************************************************************************/ +/* 导出的P2P客户端帮助函数 */ +/************************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Init(int nTimeout, CALLBACK_APISERVICE_MODULE_HELP_P2PCLIENT fpCall_P2PClient, LPVOID lParam) +{ + return m_P2PClient.ModuleHelp_P2PClient_Init(nTimeout, fpCall_P2PClient, lParam); +} +extern "C" BOOL ModuleHelp_P2PClient_Destory() +{ + return m_P2PClient.ModuleHelp_P2PClient_Destory(); +} +extern "C" BOOL ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO * pSt_PeerInfo) +{ + return m_P2PClient.ModuleHelp_P2PClient_Add(pSt_PeerInfo); +} +extern "C" BOOL ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol, XENGINE_P2XP_PEERINFO * pSt_PeerInfo /* = NULL */) +{ + return m_P2PClient.ModuleHelp_P2PClient_Get(pSt_P2PProtocol, pSt_PeerInfo); +} +extern "C" BOOL ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol, XENGINE_P2XPPEER_PROTOCOL * **pppSt_P2XPClient, int* pInt_ListCount) +{ + return m_P2PClient.ModuleHelp_P2PClient_GetLan(pSt_P2PProtocol, pppSt_P2XPClient, pInt_ListCount); +} +extern "C" BOOL ModuleHelp_P2PClient_GetLList(LPCTSTR lpszPubAddr, TCHAR * **pppszP2XPClient, int* pInt_ListCount) +{ + return m_P2PClient.ModuleHelp_P2PClient_GetLList(lpszPubAddr, pppszP2XPClient, pInt_ListCount); +} +extern "C" BOOL ModuleHelp_P2PClient_GetWList(TCHAR * **pppszP2XPClient, int* pInt_ListCount) +{ + return m_P2PClient.ModuleHelp_P2PClient_GetWList(pppszP2XPClient, pInt_ListCount); +} +extern "C" BOOL ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol) +{ + return m_P2PClient.ModuleHelp_P2PClient_Delete(pSt_P2PProtocol); +} +extern "C" BOOL ModuleHelp_P2PClient_DelAll() +{ + return m_P2PClient.ModuleHelp_P2PClient_DelAll(); +} +extern "C" BOOL ModuleHelp_P2PClient_Heart(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol) +{ + return m_P2PClient.ModuleHelp_P2PClient_Heart(pSt_P2PProtocol); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/pch.h b/XEngine_Source/XEngine_ModuleHelp/pch.h index 9d58df7930b30a2ed62029ed2d2206340984d29a..69dc24f637f66e33b5579f736ed1cbe881fa1f90 100644 --- a/XEngine_Source/XEngine_ModuleHelp/pch.h +++ b/XEngine_Source/XEngine_ModuleHelp/pch.h @@ -15,10 +15,17 @@ #endif //PCH_H #include #include +#include +#include +#include +#include #include +using namespace std; #include #include #include +#include +#include #include "../XEngine_UserProtocol.h" #include "ModuleHelp_Define.h" #include "ModuleHelp_Error.h" @@ -37,6 +44,7 @@ extern BOOL ModuleHelp_IsErrorOccur; extern DWORD ModuleHelp_dwErrorCode; #ifdef _MSC_BUILD +#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") #ifdef _WIN64 #pragma comment(lib,"../XEngine_ThirdPart/opencc/libx64/opencc") #else diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h index 4cbbd2180abffdcd2c155168fa0442dbd2068b71..82033bf60bdacbcbd74404f2f6e277fa00e296dc 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h @@ -342,6 +342,146 @@ extern "C" BOOL ModuleProtocol_Packet_LanguageQuery(TCHAR* ptszMsgBuffer, int* p 备注: *********************************************************************/ extern "C" BOOL ModuleProtocol_Packet_LanguageQuery2(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo, int nCode = 0); +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PCommon +函数功能:P2XP公用协议打包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出打好包的缓冲区 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出缓冲区大小 + 参数.三:nCode + In/Out:In + 类型:整数型 + 可空:Y + 意思:输入返回的值 + 参数.四:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:输入要打包的后续内容 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleProtocol_Packet_P2PCommon(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nCode = 0, LPCTSTR lpszMsgBuffer = NULL); +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PLan +函数功能:响应同步局域网地址列表 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 + 参数.三:pppSt_ListClients + In/Out:In + 类型:三级指针 + 可空:N + 意思:输入局域网地址信息列表 + 参数.四:nListCount + In/Out:In + 类型:整数型 + 可空:N + 意思:局域网地址列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleProtocol_Packet_P2PLan(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL*** pppSt_ListClients, int nListCount); +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PWLan +函数功能:响应同步局域网所有地址列表 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 + 参数.三:pStl_ListClients + In/Out:In + 类型:容器指针 + 可空:N + 意思:客户端列表 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleProtocol_Packet_P2PWLan(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, list* pStl_ListClients); +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PUser +函数功能:响应用户查询用户信息的请求协议封包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 + 参数.三:pSt_PeerInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入获取到的用户信息 + 参数.四:pSt_AddrInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:IP地址信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleProtocol_Packet_P2PUser(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_PeerInfo, XENGINE_IPADDRINFO* pSt_AddrInfo); +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PConnect +函数功能:请求连接打包函数 + 参数.一:pSt_ProtocolHdr + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要打包的协议头 + 参数.二:pSt_IOProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入连接信息 + 参数.三:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.四:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleProtocol_Packet_P2PConnect(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPIO_PROTOCOL* pSt_IOProtocol); /************************************************************************/ /* 导出的协议解析函数 */ /************************************************************************/ @@ -411,4 +551,28 @@ extern "C" BOOL ModuleProtocol_Parse_Bank(LPCTSTR lpszMsgBuffer, int nMsgLen, XE 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo); \ No newline at end of file +extern "C" BOOL ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo); +/******************************************************************** +函数名称:ModuleProtocol_Parse_P2PClient +函数功能:P2P客户端请求解析函数 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入缓冲区大小 + 参数.三:pSt_P2XPPeer + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输出解析后的节点信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleProtocol_Parse_P2PClient(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL * pSt_P2XPPeer); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp index c6846c69996b2696b381adcf17f78bf94e5fa043..e3f17cb1dfebc07cdbe4b3c5e68130b8db138aeb 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp @@ -634,4 +634,316 @@ BOOL CModuleProtocol_Packet::ModuleProtocol_Packet_LanguageQuery2(TCHAR* ptszMsg "%s\r\n" "%d", nCode, pSt_LanguageInfo->tszSourceStr, pSt_LanguageInfo->tszDestStr, pSt_LanguageInfo->enType); return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PCommon +函数功能:P2XP公用协议打包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出打好包的缓冲区 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出缓冲区大小 + 参数.三:nCode + In/Out:In + 类型:整数型 + 可空:Y + 意思:输入返回的值 + 参数.四:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:输入要打包的后续内容 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Packet::ModuleProtocol_Packet_P2PCommon(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nCode /* = 0 */, LPCTSTR lpszMsgBuffer /* = NULL */) +{ + ModuleProtocol_IsErrorOccur = FALSE; + + if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + ModuleProtocol_IsErrorOccur = TRUE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PACKET_PARAMENT; + return FALSE; + } + Json::Value st_JsonRoot; + + st_JsonRoot["nCode"] = 0; + if (NULL != lpszMsgBuffer) + { + st_JsonRoot["lpszMsgBuffer"] = lpszMsgBuffer; + } + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); + memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); + return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PLan +函数功能:响应同步局域网地址列表 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 + 参数.三:pppSt_ListClients + In/Out:In + 类型:三级指针 + 可空:N + 意思:输入局域网地址信息列表 + 参数.四:nListCount + In/Out:In + 类型:整数型 + 可空:N + 意思:局域网地址列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Packet::ModuleProtocol_Packet_P2PLan(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL*** pppSt_ListClients, int nListCount) +{ + ModuleProtocol_IsErrorOccur = FALSE; + + if ((NULL == pppSt_ListClients) || (NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + ModuleProtocol_IsErrorOccur = FALSE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PACKET_PARAMENT; + return FALSE; + } + Json::Value st_JsonRoot; + Json::Value st_JsonArray; + for (int i = 0; i < nListCount; i++) + { + Json::Value st_JsonObject; + st_JsonObject["ClientUser"] = (*pppSt_ListClients)[i]->tszUserName; + st_JsonObject["ClientAddr"] = (*pppSt_ListClients)[i]->tszPrivateAddr; + st_JsonArray.append(st_JsonObject); + } + st_JsonRoot["nCode"] = 0; + st_JsonRoot["lpszMsgBuffer"] = "sucess"; + st_JsonRoot["ClientArray"] = st_JsonArray; + st_JsonRoot["ClientCount"] = nListCount; + + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); + memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); + return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PWLan +函数功能:响应同步局域网所有地址列表 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 + 参数.三:pStl_ListClients + In/Out:In + 类型:容器指针 + 可空:N + 意思:客户端列表 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Packet::ModuleProtocol_Packet_P2PWLan(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, list* pStl_ListClients) +{ + ModuleProtocol_IsErrorOccur = FALSE; + + if ((NULL == pStl_ListClients) || (NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + ModuleProtocol_IsErrorOccur = FALSE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PACKET_PARAMENT; + return FALSE; + } + unordered_map> stl_MapClient; + //首先处理公网下的局域网网段列表 + for (auto stl_ListIterator = pStl_ListClients->begin(); stl_ListIterator != pStl_ListClients->end(); stl_ListIterator++) + { + TCHAR tszClientAddr[128]; + XENGINE_LIBADDR st_LibAddr; + P2XPPROTOCOL_LANPACKET st_LANPacket; + + memset(tszClientAddr, '\0', sizeof(tszClientAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + memset(&st_LANPacket, '\0', sizeof(P2XPPROTOCOL_LANPACKET)); + //分割 + BaseLib_OperatorIPAddr_IsIPV4Addr(stl_ListIterator->tszPrivateAddr, &st_LibAddr); + _stprintf(tszClientAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + //赋值 + _tcscpy(st_LANPacket.tszUsername, stl_ListIterator->tszUserName); + _tcscpy(st_LANPacket.tszClientAddr, stl_ListIterator->tszPrivateAddr); + //判断是否存在 + unordered_map>::iterator stl_MapIterator = stl_MapClient.find(tszClientAddr); + if (stl_MapIterator == stl_MapClient.end()) + { + list stl_ListClient; + + stl_ListClient.push_back(st_LANPacket); + stl_MapClient.insert(make_pair(tszClientAddr, stl_ListClient)); + } + else + { + stl_MapIterator->second.push_back(st_LANPacket); + } + } + //打包成JSON数据 + int nCount = 0; + Json::Value st_JsonRoot; + Json::Value st_JsonArray; + + for (auto stl_MapIterator = stl_MapClient.begin(); stl_MapIterator != stl_MapClient.end(); stl_MapIterator++) + { + Json::Value st_JsonList; + for (auto stl_ListIterator = stl_MapIterator->second.begin(); stl_ListIterator != stl_MapIterator->second.end(); stl_ListIterator++) + { + Json::Value st_JsonObject; + + nCount++; + st_JsonObject["ClientUser"] = stl_ListIterator->tszUsername; + st_JsonObject["ClientAddr"] = stl_ListIterator->tszClientAddr; + st_JsonList.append(st_JsonObject); + } + st_JsonArray["tszLANAddr"] = stl_MapIterator->first.c_str(); + st_JsonArray["tszLANList"] = st_JsonList; + } + st_JsonRoot["nCode"] = 0; + st_JsonRoot["lpszMsgBuffer"] = "sucess"; + st_JsonRoot["ClientArray"] = st_JsonArray; + st_JsonRoot["ClientCount"] = nCount; + + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); + memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); + return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PUser +函数功能:响应用户查询用户信息的请求协议封包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 + 参数.三:pSt_PeerInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入获取到的用户信息 + 参数.四:pSt_AddrInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:IP地址信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Packet::ModuleProtocol_Packet_P2PUser(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_PeerInfo, XENGINE_IPADDRINFO* pSt_AddrInfo) +{ + ModuleProtocol_IsErrorOccur = FALSE; + + if ((NULL == pSt_PeerInfo) || (NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + ModuleProtocol_IsErrorOccur = FALSE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PACKET_PARAMENT; + return FALSE; + } + Json::Value st_JsonRoot; + Json::Value st_JsonAddr; + Json::StreamWriterBuilder st_JsonBuilder; + + st_JsonRoot["Code"] = 0; + st_JsonRoot["lpszMsgBuffer"] = "sucess"; + st_JsonRoot["dwConnectType"] = (Json::Value::UInt)pSt_PeerInfo->dwConnectType; + st_JsonRoot["dwPeerType"] = pSt_PeerInfo->dwPeerType; + st_JsonRoot["tszConnectAddr"] = pSt_PeerInfo->tszConnectAddr; + st_JsonRoot["tszPrivateAddr"] = pSt_PeerInfo->tszPrivateAddr; + st_JsonRoot["tszPublicAddr"] = pSt_PeerInfo->tszPublicAddr; + st_JsonRoot["tszUserName"] = pSt_PeerInfo->tszUserName; + + st_JsonAddr["tszIPCountry"] = pSt_AddrInfo->tszIPCountry; + st_JsonAddr["tszIPProvince"] = pSt_AddrInfo->tszIPProvince; + st_JsonAddr["tszIPCity"] = pSt_AddrInfo->tszIPCity; + st_JsonAddr["tszIPCounty"] = pSt_AddrInfo->tszIPCounty; + st_JsonAddr["tszIPISP"] = pSt_AddrInfo->tszIPISP; + + st_JsonRoot["st_AddrInfo"] = st_JsonAddr; + + st_JsonBuilder["emitUTF8"] = true; + *pInt_MsgLen = Json::writeString(st_JsonBuilder, st_JsonRoot).length(); + memcpy(ptszMsgBuffer, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), *pInt_MsgLen); + return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PConnect +函数功能:请求连接打包函数 + 参数.一:pSt_ProtocolHdr + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要打包的协议头 + 参数.二:pSt_IOProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入连接信息 + 参数.三:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.四:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Packet::ModuleProtocol_Packet_P2PConnect(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPIO_PROTOCOL* pSt_IOProtocol) +{ + ModuleProtocol_IsErrorOccur = FALSE; + + if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + ModuleProtocol_IsErrorOccur = FALSE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PACKET_PARAMENT; + return FALSE; + } + Json::Value st_JsonRoot; + + st_JsonRoot["tszSourceUser"] = pSt_IOProtocol->tszSourceUser; + st_JsonRoot["tszDestUser"] = pSt_IOProtocol->tszDestUser; + st_JsonRoot["tszConnectAddr"] = pSt_IOProtocol->tszConnectAddr; + st_JsonRoot["nDestPort"] = pSt_IOProtocol->nDestPort; + st_JsonRoot["bIsTcp"] = pSt_IOProtocol->bIsTcp; + + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); + memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); + return TRUE; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h index ab7ce1fcd64be35d2e866f91019aa247eb3f2a82..5c385390066fa286777c4052430a33d1ea486712 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h @@ -10,7 +10,11 @@ // Purpose: 协议打包类 // History: *********************************************************************/ - +typedef struct +{ + TCHAR tszUsername[MAX_PATH]; + TCHAR tszClientAddr[128]; +}P2XPPROTOCOL_LANPACKET; class CModuleProtocol_Packet { @@ -28,5 +32,11 @@ public: BOOL ModuleProtocol_Packet_BankQuery2(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_BANKINFO* pSt_BankInfo, int nCode = 0); BOOL ModuleProtocol_Packet_LanguageQuery(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo, int nCode = 0, LPCTSTR lpszMsgBuffer = NULL); BOOL ModuleProtocol_Packet_LanguageQuery2(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo, int nCode = 0); +public: + BOOL ModuleProtocol_Packet_P2PCommon(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nCode = 0, LPCTSTR lpszMsgBuffer = NULL); + BOOL ModuleProtocol_Packet_P2PLan(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL*** pppSt_ListClients, int nListCount); + BOOL ModuleProtocol_Packet_P2PWLan(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, list* pStl_ListClients); + BOOL ModuleProtocol_Packet_P2PUser(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_PeerInfo, XENGINE_IPADDRINFO* pSt_AddrInfo); + BOOL ModuleProtocol_Packet_P2PConnect(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPIO_PROTOCOL* pSt_IOProtocol); private: }; \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp index 03040fb3f37fbd53327ed8092197ecbec56050ea..f0ce369ee6f68d43db593fd1eebe75796421e63f 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp @@ -240,4 +240,74 @@ BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuff _tcscpy(pSt_LanguageInfo->tszSourceStr, st_JsonTranslation[0][0]["src"].asCString()); _tcscpy(pSt_LanguageInfo->tszDestStr, st_JsonTranslation[0][0]["tgt"].asCString()); return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Parse_P2PClient +函数功能:P2P客户端请求解析函数 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入缓冲区大小 + 参数.三:pSt_P2XPPeer + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输出解析后的节点信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_P2PClient(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_P2XPPeer) +{ + ModuleProtocol_IsErrorOccur = FALSE; + + if ((NULL == lpszMsgBuffer) || (NULL == pSt_P2XPPeer)) + { + ModuleProtocol_IsErrorOccur = TRUE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PARSE_PARAMENT; + return FALSE; + } + Json::Value st_JsonRoot; + Json::CharReaderBuilder st_JsonBuild; + Json::CharReader* pSt_JsonReader(st_JsonBuild.newCharReader()); + + JSONCPP_STRING st_JsonError; + //解析JSON + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) + { + ModuleProtocol_IsErrorOccur = TRUE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PARSE_JSON; + return FALSE; + } + delete pSt_JsonReader; + pSt_JsonReader = NULL; + + if (!st_JsonRoot["tszUserName"].isNull()) + { + _tcscpy(pSt_P2XPPeer->tszUserName, st_JsonRoot["tszUserName"].asCString()); + } + if (!st_JsonRoot["tszPrivateAddr"].isNull()) + { + _tcscpy(pSt_P2XPPeer->tszPrivateAddr, st_JsonRoot["tszPrivateAddr"].asCString()); + } + if (!st_JsonRoot["tszPublicAddr"].isNull()) + { + _tcscpy(pSt_P2XPPeer->tszPublicAddr, st_JsonRoot["tszPublicAddr"].asCString()); + } + if (!st_JsonRoot["dwConnectType"].isNull()) + { + pSt_P2XPPeer->dwConnectType = st_JsonRoot["dwConnectType"].asInt(); + } + if (!st_JsonRoot["dwPeerType"].isNull()) + { + pSt_P2XPPeer->dwPeerType = st_JsonRoot["dwPeerType"].asInt(); + } + return TRUE; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h index f7c7e0892eacd42113b353c7f8acadbb6154b31a..71b51048f179007f2cf65c4e6446f5f95e1bf567 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h @@ -21,5 +21,6 @@ public: BOOL ModuleProtocol_Parse_IDCard(LPCTSTR lpszMsgBuffer, XENGINE_IDCARDINFO* pSt_IDInfo); BOOL ModuleProtocol_Parse_Bank(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_BANKINFO* pSt_BankInfo); BOOL ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo); + BOOL ModuleProtocol_Parse_P2PClient(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_P2XPPeer); private: }; \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def index 8fce14c46afdbde63a5c69bbda849d0de9dbd2af..7e371c449248c9f4e42e37504aa9f4b218a017a8 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def +++ b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def @@ -13,7 +13,13 @@ EXPORTS ModuleProtocol_Packet_BankQuery2 ModuleProtocol_Packet_LanguageQuery ModuleProtocol_Packet_LanguageQuery2 + ModuleProtocol_Packet_P2PCommon + ModuleProtocol_Packet_P2PLan + ModuleProtocol_Packet_P2PWLan + ModuleProtocol_Packet_P2PUser + ModuleProtocol_Packet_P2PConnect ModuleProtocol_Parse_IDCard ModuleProtocol_Parse_Bank - ModuleProtocol_Parse_Translation \ No newline at end of file + ModuleProtocol_Parse_Translation + ModuleProtocol_Parse_P2PClient \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/pch.cpp b/XEngine_Source/XEngine_ModuleProtocol/pch.cpp index e83179b6a3f76558d1ee8758e295deece4bea824..f9a04a5f5f694338c89794133889d85af53e74c9 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/pch.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/pch.cpp @@ -71,6 +71,26 @@ extern "C" BOOL ModuleProtocol_Packet_LanguageQuery2(TCHAR * ptszMsgBuffer, int* { return m_ProtocolPacket.ModuleProtocol_Packet_LanguageQuery2(ptszMsgBuffer, pInt_MsgLen, pSt_LanguageInfo, nCode); } +extern "C" BOOL ModuleProtocol_Packet_P2PCommon(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, int nCode, LPCTSTR lpszMsgBuffer) +{ + return m_ProtocolPacket.ModuleProtocol_Packet_P2PCommon(ptszMsgBuffer, pInt_MsgLen, nCode, lpszMsgBuffer); +} +extern "C" BOOL ModuleProtocol_Packet_P2PLan(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL * **pppSt_ListClients, int nListCount) +{ + return m_ProtocolPacket.ModuleProtocol_Packet_P2PLan(ptszMsgBuffer, pInt_MsgLen, pppSt_ListClients, nListCount); +} +extern "C" BOOL ModuleProtocol_Packet_P2PWLan(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, list*pStl_ListClients) +{ + return m_ProtocolPacket.ModuleProtocol_Packet_P2PWLan(ptszMsgBuffer, pInt_MsgLen, pStl_ListClients); +} +extern "C" BOOL ModuleProtocol_Packet_P2PUser(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL * pSt_PeerInfo, XENGINE_IPADDRINFO * pSt_AddrInfo) +{ + return m_ProtocolPacket.ModuleProtocol_Packet_P2PUser(ptszMsgBuffer, pInt_MsgLen, pSt_PeerInfo, pSt_AddrInfo); +} +extern "C" BOOL ModuleProtocol_Packet_P2PConnect(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPIO_PROTOCOL * pSt_IOProtocol) +{ + return m_ProtocolPacket.ModuleProtocol_Packet_P2PConnect(ptszMsgBuffer, pInt_MsgLen, pSt_IOProtocol); +} /************************************************************************/ /* 导出的协议解析函数 */ /************************************************************************/ @@ -85,4 +105,8 @@ extern "C" BOOL ModuleProtocol_Parse_Bank(LPCTSTR lpszMsgBuffer, int nMsgLen, XE extern "C" BOOL ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_LANGUAGEINFO * pSt_LanguageInfo) { return m_ProtocolParse.ModuleProtocol_Parse_Translation(lpszMsgBuffer, nMsgLen, pSt_LanguageInfo); +} +extern "C" BOOL ModuleProtocol_Parse_P2PClient(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL * pSt_P2XPPeer) +{ + return m_ProtocolParse.ModuleProtocol_Parse_P2PClient(lpszMsgBuffer, nMsgLen, pSt_P2XPPeer); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/pch.h b/XEngine_Source/XEngine_ModuleProtocol/pch.h index 96ac564785c03cb6567fba86ddddb88aeb0e85f3..faf8f1c4ac17b1b509059eeaf861c79c0dae3aa1 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/pch.h +++ b/XEngine_Source/XEngine_ModuleProtocol/pch.h @@ -15,12 +15,15 @@ #endif //PCH_H #include #include +#include +#include #include #include #include #include -#include -#include +#include +#include +using namespace std; #include "../XEngine_UserProtocol.h" #include "ModuleProtocol_Define.h" #include "ModuleProtocol_Error.h" @@ -39,6 +42,7 @@ extern BOOL ModuleProtocol_IsErrorOccur; extern DWORD ModuleProtocol_dwErrorCode; #ifdef _MSC_BUILD +#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") #ifdef _DEBUG #ifdef _WIN64 #pragma comment(lib,"../x64/Debug/jsoncpp") diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile index 2c7d9f7deb05823b9a508159c31113fb5b978e1a..b06de8a9a4ad8cb91a14b104345853b46089e17e 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile @@ -10,7 +10,7 @@ LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool LIBEX = -static-libgcc -ldl -lrt -lpthread LOADSO = -Wl,-rpath=./,--disable-new-dtags LIBINCLUDE = XEngine_Configure.o XEngine_Network.o XEngine_HTTPTask.o XEngine_PluginTask.o XEngine_HttpApp.o \ - HTTPTask_IPInfo.o HTTPTask_IDCard.o HTTPTask_Phone.o HTTPTask_Bank.o HTTPTask_Language.o HTTPTask_Translation.o + HTTPTask_IPInfo.o HTTPTask_IDCard.o HTTPTask_Phone.o HTTPTask_Bank.o HTTPTask_Language.o HTTPTask_Translation.o HTTPTask_P2PClient.o ifeq ($(RELEASE),1) FLAGS = -c -O2 @@ -50,6 +50,8 @@ HTTPTask_Language.o:./XEngine_HTTPTask/HTTPTask_Language.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./XEngine_HTTPTask/HTTPTask_Language.cpp HTTPTask_Translation.o:./XEngine_HTTPTask/HTTPTask_Translation.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./XEngine_HTTPTask/HTTPTask_Translation.cpp +HTTPTask_P2PClient.o:./XEngine_HTTPTask/HTTPTask_P2PClient.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./XEngine_HTTPTask/HTTPTask_P2PClient.cpp XEngine_HttpApp.o:./XEngine_HttpApp.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./XEngine_HttpApp.cpp diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp index 91fbae89c8976359246cff44bc3a146acaa86887..48a9e3717ff339e1724c300d42977f502af17a73 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp @@ -57,7 +57,7 @@ XHTHREAD CALLBACK XEngine_HTTPTask_Thread(LPVOID lParam) BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR lpszClientAddr, LPCTSTR lpszRVBuffer, int nRVLen) { int nMsgLen = 4096; - //LPCTSTR lpszMethodPost = _T("POST"); + LPCTSTR lpszMethodPost = _T("POST"); LPCTSTR lpszMethodGet = _T("GET"); TCHAR tszMsgBuffer[4096]; RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; //发送给客户端的参数 @@ -67,72 +67,94 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR st_HDRParam.nHttpCode = 200; //HTTP CODE码 st_HDRParam.bIsClose = TRUE; //收到回复后就关闭 - if (0 == _tcsnicmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodGet))) - { - TCHAR** pptszList; - TCHAR tszUrlName[128]; - int nListCount = 0; - memset(tszUrlName, '\0', sizeof(tszUrlName)); - //得到URL参数个数 - RfcComponents_HttpHelp_GetParament(pSt_HTTPParam->tszHttpUri, &pptszList, &nListCount, tszUrlName); - if (nListCount < 1) - { - st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); - XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); - BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - return FALSE; - } - TCHAR tszKey[128]; - TCHAR tszValue[128]; - LPCTSTR lpszFuncName = _T("api"); - LPCTSTR lpszParamFunc1 = _T("function"); - LPCTSTR lpszParamFunc2 = _T("params1"); - LPCTSTR lpszParamValue1 = _T("ip"); - LPCTSTR lpszParamValue2 = _T("id"); - LPCTSTR lpszParamValue3 = _T("phone"); - LPCTSTR lpszParamValue4 = _T("bank"); - LPCTSTR lpszParamValue5 = _T("language"); - LPCTSTR lpszParamValue6 = _T("translation"); + TCHAR** pptszList; + TCHAR tszUrlName[128]; + int nListCount = 0; - memset(tszKey, '\0', sizeof(tszKey)); - memset(tszValue, '\0', sizeof(tszValue)); + memset(tszUrlName, '\0', sizeof(tszUrlName)); + //得到URL参数个数 + RfcComponents_HttpHelp_GetParament(pSt_HTTPParam->tszHttpUri, &pptszList, &nListCount, tszUrlName); + if (nListCount < 1) + { + st_HDRParam.nHttpCode = 404; + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return FALSE; + } + TCHAR tszKey[128]; + TCHAR tszValue[128]; + LPCTSTR lpszFuncName = _T("api"); + LPCTSTR lpszParamFuncKey = _T("function"); + LPCTSTR lpszParamName = _T("params1"); + LPCTSTR lpszParamIPAddr = _T("ip"); + LPCTSTR lpszParamIDCard = _T("id"); + LPCTSTR lpszParamPhone = _T("phone"); + LPCTSTR lpszParamBank = _T("bank"); + LPCTSTR lpszParamLanguage = _T("language"); + LPCTSTR lpszParamTranslation = _T("translation"); + LPCTSTR lpszParamP2PClient = _T("p2p"); - if (0 != _tcsnicmp(lpszFuncName, tszUrlName, _tcslen(lpszFuncName))) - { - st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); - XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); - BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - return FALSE; - } - //获得函数名 - BaseLib_OperatorString_GetKeyValue(pptszList[0], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc1, tszKey, _tcslen(lpszParamFunc1))) - { - st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); - XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); - BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - return FALSE; - } - //首先处理插件 - if (ModulePlugin_Loader_Find(tszValue)) + memset(tszKey, '\0', sizeof(tszKey)); + memset(tszValue, '\0', sizeof(tszValue)); + + if (0 != _tcsnicmp(lpszFuncName, tszUrlName, _tcslen(lpszFuncName))) + { + st_HDRParam.nHttpCode = 404; + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return FALSE; + } + //获得函数名 + BaseLib_OperatorString_GetKeyValue(pptszList[0], "=", tszKey, tszValue); + if (0 != _tcsnicmp(lpszParamFuncKey, tszKey, _tcslen(lpszParamFuncKey))) + { + st_HDRParam.nHttpCode = 404; + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return FALSE; + } + //首先处理插件 + if (ModulePlugin_Loader_Find(tszValue)) + { + XEngine_PluginTask_Handle(tszValue, lpszClientAddr, lpszRVBuffer, nRVLen, &pptszList, nListCount); + return TRUE; + } + if (0 == _tcsnicmp(lpszMethodPost, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodPost))) + { + if (0 == _tcsnicmp(lpszParamP2PClient, tszValue, _tcslen(lpszParamP2PClient))) { - XEngine_PluginTask_Handle(tszValue, lpszClientAddr, lpszRVBuffer, nRVLen, &pptszList, nListCount); - return TRUE; + //是不是P2P + memset(tszKey, '\0', sizeof(tszKey)); + memset(tszValue, '\0', sizeof(tszValue)); + BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) + { + st_HDRParam.nHttpCode = 404; + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return FALSE; + } + XEngine_HTTPTask_P2PClient(lpszClientAddr, lpszRVBuffer, nRVLen, _ttoi(tszValue)); } + } + else if (0 == _tcsnicmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodGet))) + { //是不是ip查询 - if (0 == _tcsnicmp(lpszParamValue1, tszValue, _tcslen(lpszParamValue1))) + if (0 == _tcsnicmp(lpszParamIPAddr, tszValue, _tcslen(lpszParamIPAddr))) { memset(tszKey, '\0', sizeof(tszKey)); memset(tszValue, '\0', sizeof(tszValue)); BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc2, tszKey, _tcslen(lpszParamFunc2))) + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -149,13 +171,13 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[2], "=", tszKey, tszGetType); XEngine_HTTPTask_IPInfo(lpszClientAddr, tszValue, _ttoi(tszGetType)); } - else if (0 == _tcsnicmp(lpszParamValue2, tszValue, _tcslen(lpszParamValue2))) + else if (0 == _tcsnicmp(lpszParamIDCard, tszValue, _tcslen(lpszParamIDCard))) { //是不是身份证查询 memset(tszKey, '\0', sizeof(tszKey)); memset(tszValue, '\0', sizeof(tszValue)); BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc2, tszKey, _tcslen(lpszParamFunc2))) + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -172,13 +194,13 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[2], "=", tszKey, tszGetType); XEngine_HTTPTask_IDCard(lpszClientAddr, tszValue, _ttoi(tszGetType)); } - else if (0 == _tcsnicmp(lpszParamValue3, tszValue, _tcslen(lpszParamValue3))) + else if (0 == _tcsnicmp(lpszParamPhone, tszValue, _tcslen(lpszParamPhone))) { //是不是电话号码查询 memset(tszKey, '\0', sizeof(tszKey)); memset(tszValue, '\0', sizeof(tszValue)); BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc2, tszKey, _tcslen(lpszParamFunc2))) + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -195,13 +217,13 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[2], "=", tszKey, tszGetType); XEngine_HTTPTask_PhoneInfo(lpszClientAddr, tszValue, _ttoi(tszGetType)); } - else if (0 == _tcsnicmp(lpszParamValue4, tszValue, _tcslen(lpszParamValue4))) + else if (0 == _tcsnicmp(lpszParamBank, tszValue, _tcslen(lpszParamBank))) { //是不是银行卡信息 memset(tszKey, '\0', sizeof(tszKey)); memset(tszValue, '\0', sizeof(tszValue)); BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc2, tszKey, _tcslen(lpszParamFunc2))) + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -218,7 +240,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[2], "=", tszKey, tszGetType); XEngine_HTTPTask_BankInfo(lpszClientAddr, tszValue, _ttoi(tszGetType)); } - else if (0 == _tcsnicmp(lpszParamValue5, tszValue, _tcslen(lpszParamValue5))) + else if (0 == _tcsnicmp(lpszParamLanguage, tszValue, _tcslen(lpszParamLanguage))) { //是不是语言转换 TCHAR tszCvtType[64]; @@ -230,7 +252,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR memset(tszGetType, '\0', sizeof(tszGetType)); BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc2, tszKey, _tcslen(lpszParamFunc2))) + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -245,7 +267,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[3], "=", tszKey, tszCvtType); XEngine_HTTPTask_Language(lpszClientAddr, tszValue, _ttoi(tszGetType), _ttoi(tszCvtType)); } - else if (0 == _tcsnicmp(lpszParamValue6, tszValue, _tcslen(lpszParamValue6))) + else if (0 == _tcsnicmp(lpszParamTranslation, tszValue, _tcslen(lpszParamTranslation))) { //是不是翻译 TCHAR tszCvtType[64]; @@ -257,7 +279,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR memset(tszGetType, '\0', sizeof(tszGetType)); BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc2, tszKey, _tcslen(lpszParamFunc2))) + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -270,7 +292,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[2], "=", tszKey, tszGetType); BaseLib_OperatorString_GetKeyValue(pptszList[3], "=", tszKey, tszCvtType); - XEngine_HTTPTask_Translation(lpszClientAddr, tszValue, _ttoi(tszGetType), _ttoi(tszCvtType));; + XEngine_HTTPTask_Translation(lpszClientAddr, tszValue, _ttoi(tszGetType), _ttoi(tszCvtType)); } BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); } diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8f4c23d3fc54d423ccd058ff6c18a8b528528cfb --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp @@ -0,0 +1,133 @@ +#include "../XEngine_Hdr.h" + +void CALLBACK XEngine_HTTPTask_P2PCallback(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, LPVOID lParam) +{ + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("HTTP客户端:公网:%s,私网:%s,连接:%s P2P离开"), pSt_P2PProtocol->tszPublicAddr, pSt_P2PProtocol->tszPrivateAddr, pSt_P2PProtocol->tszConnectAddr); +} +BOOL XEngine_HTTPTask_P2PClient(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, int unOperatorCode) +{ + int nSDLen = 4096; + int nRVLen = 4096; + TCHAR tszSDBuffer[4096]; + TCHAR tszRVBuffer[MAX_PATH]; + RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; //发送给客户端的参数 + + memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); + memset(tszRVBuffer, '\0', sizeof(tszRVBuffer)); + memset(&st_HDRParam, '\0', sizeof(RFCCOMPONENTS_HTTP_HDRPARAM)); + + st_HDRParam.nHttpCode = 200; //HTTP CODE码 + st_HDRParam.bIsClose = TRUE; //收到回复后就关闭 + if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REQLOGIN == unOperatorCode) + { + XENGINE_P2XP_PEERINFO st_ClientPeer; + memset(&st_ClientPeer, '\0', sizeof(XENGINE_P2XP_PEERINFO)); + + if (!ModuleProtocol_Parse_P2PClient(lpszMsgBuffer, nMsgLen, &st_ClientPeer.st_PeerAddr)) + { + ModuleProtocol_Packet_P2PCommon(tszRVBuffer, &nRVLen, 400, "协议错误"); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("HTTP客户端:%s,处理登录错误,解析协议失败,错误码:%lX"), lpszClientAddr, ModuleProtocol_GetLastError()); + return FALSE; + } + //如果没有填充公用地址,用他的连接地址代替,外网服务器都可以这样做 + if (_tcslen(st_ClientPeer.st_PeerAddr.tszPublicAddr) <= 0) + { + _tcscpy(st_ClientPeer.st_PeerAddr.tszPublicAddr, lpszClientAddr); + BaseLib_OperatorIPAddr_SegAddr(st_ClientPeer.st_PeerAddr.tszPublicAddr, NULL); + } + //获取外网IP所在位置 + ModuleDatabase_IPInfo_IPV4Query(&st_ClientPeer.st_IPAddrInfo, st_ClientPeer.st_PeerAddr.tszPublicAddr); + + st_ClientPeer.st_PeerTimer.dwUserTime = time(NULL); + st_ClientPeer.st_PeerTimer.dwKeepAlive = time(NULL); + st_ClientPeer.bIsLogin = TRUE; + _tcscpy(st_ClientPeer.st_PeerAddr.tszConnectAddr, lpszClientAddr); + if (!ModuleHelp_P2PClient_Add(&st_ClientPeer)) + { + ModuleProtocol_Packet_P2PCommon(tszRVBuffer, &nRVLen, 500, "内部错误"); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("HTTP客户端:%s,处理登录错误,设置用户信息失败,错误码:%lX"), lpszClientAddr, ModuleHelp_GetLastError()); + return FALSE; + } + ModuleProtocol_Packet_P2PCommon(tszRVBuffer, &nRVLen); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,处理用户登录请求成功,用户名:%s"), lpszClientAddr, st_ClientPeer.st_PeerAddr.tszUserName); + } + else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REQLANLIST == unOperatorCode) + { + XENGINE_P2XPPEER_PROTOCOL st_P2PProtocol; + memset(&st_P2PProtocol, '\0', sizeof(XENGINE_P2XPPEER_PROTOCOL)); + + if (!ModuleProtocol_Parse_P2PClient(lpszMsgBuffer, nMsgLen, &st_P2PProtocol)) + { + ModuleProtocol_Packet_P2PCommon(tszRVBuffer, &nRVLen, 400, "协议错误"); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("HTTP客户端:%s,列表请求失败,协议解析错误,错误码:%lX"), lpszClientAddr, ModuleProtocol_GetLastError()); + return FALSE; + } + //请求同步列表 + if (_tcslen(st_P2PProtocol.tszPrivateAddr) > 0) + { + int nListCount = 0; + XENGINE_P2XPPEER_PROTOCOL** ppSt_ListClients; + if (!ModuleHelp_P2PClient_GetLan(&st_P2PProtocol, &ppSt_ListClients, &nListCount)) + { + ModuleProtocol_Packet_P2PCommon(tszRVBuffer, &nRVLen, 500, "内部错误"); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("HTTP客户端:%s,列表请求失败,请求同步局域网列表失败,公有地址:%s,私有地址:%s,错误码:%lX"), lpszClientAddr, st_P2PProtocol.tszPublicAddr, st_P2PProtocol.tszPrivateAddr, ModuleHelp_GetLastError()); + return FALSE; + } + ModuleProtocol_Packet_P2PLan(tszRVBuffer, &nRVLen, &ppSt_ListClients, nListCount); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListClients, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,请求同步局域网列表成功,公有地址:%s,私有地址:%s"), lpszClientAddr, st_P2PProtocol.tszPublicAddr, st_P2PProtocol.tszPrivateAddr); + } + else + { + //公网下所有列表 + int nListCount = 0; + TCHAR** ppszClientList; + list stl_ListClient; + if (ModuleHelp_P2PClient_GetLList(st_P2PProtocol.tszPublicAddr, &ppszClientList, &nListCount)) + { + for (int i = 0; i < nListCount; i++) + { + int nLanCount = 0; + XENGINE_P2XPPEER_PROTOCOL** ppSt_ListClients; + memset(st_P2PProtocol.tszPrivateAddr, '\0', sizeof(st_P2PProtocol.tszPrivateAddr)); + + _tcscpy(st_P2PProtocol.tszPrivateAddr, ppszClientList[i]); + + if (ModuleHelp_P2PClient_GetLan(&st_P2PProtocol, &ppSt_ListClients, &nLanCount)) + { + for (int j = 0; j < nLanCount; j++) + { + stl_ListClient.push_back(*ppSt_ListClients[j]); + } + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListClients, nLanCount); + } + } + BaseLib_OperatorMemory_Free((XPPPMEM)&ppszClientList, nListCount); + } + ModuleProtocol_Packet_P2PWLan(tszRVBuffer, &nRVLen, &stl_ListClient); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,请求同步公有局域网列表成功,公有地址:%s"), lpszClientAddr, st_P2PProtocol.tszPublicAddr); + } + } + else + { + st_HDRParam.nHttpCode = 404; + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("客户端:%s,请求了一条未知的子协议:%lX"), lpszClientAddr, unOperatorCode); + } + return TRUE; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.h new file mode 100644 index 0000000000000000000000000000000000000000..02bfba95c745351e5935b68205c94b6fc9b42524 --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.h @@ -0,0 +1,4 @@ +#pragma once + +void CALLBACK XEngine_HTTPTask_P2PCallback(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, LPVOID lParam); +BOOL XEngine_HTTPTask_P2PClient(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, int unOperatorCode); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h index 78f771dba55c4fdafc9c83b128e61b327c87e52d..8d838f682e4dd6b66000cb198dc90d4ff1253f35 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h @@ -62,6 +62,7 @@ using namespace std; #include "XEngine_HTTPTask/HTTPTask_Bank.h" #include "XEngine_HTTPTask/HTTPTask_Language.h" #include "XEngine_HTTPTask/HTTPTask_Translation.h" +#include "XEngine_HTTPTask/HTTPTask_P2PClient.h" /******************************************************************** // Created: 2022/01/20 14:42:06 // File Name: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ServiceApp\XEngine_HttpApp\XEngine_Hdr.h diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp index 9b72db249d31ddc7f9e4305cd68abe12e7f3360a..8b25c75342f3205ef17bf1e6032fe71d0a30e9ba 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp @@ -38,6 +38,8 @@ void ServiceApp_Stop(int signo) ModuleDatabase_IDCard_Destory(); ModuleDatabase_Phone_Destory(); ModuleDatabase_Bank_Destory(); + //销毁其他 + ModuleHelp_P2PClient_Destory(); //销毁日志资源 HelpComponents_XLog_Destroy(xhLog); ModulePlugin_Core_Destroy(); @@ -226,6 +228,14 @@ int main(int argc, char** argv) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("启动服务中,HTTP消息服务没有被启用")); } + //初始化P2P + if (!ModuleHelp_P2PClient_Init(st_ServiceConfig.st_XTime.nP2PTimeOut, XEngine_HTTPTask_P2PCallback)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动P2P客户端管理器失败,错误:%lX"), ModuleHelp_GetLastError()); + goto XENGINE_SERVICEAPP_EXIT; + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动P2P客户端管理器成功,超时时间设置:%d 秒"), st_ServiceConfig.st_XTime.nP2PTimeOut); + //启动插件 if (!ModulePlugin_Core_Init()) { @@ -278,6 +288,8 @@ XENGINE_SERVICEAPP_EXIT: ModuleDatabase_IDCard_Destory(); ModuleDatabase_Phone_Destory(); ModuleDatabase_Bank_Destory(); + //销毁其他 + ModuleHelp_P2PClient_Destory(); //销毁日志资源 HelpComponents_XLog_Destroy(xhLog); ModulePlugin_Core_Destroy(); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj index 1af4aece3ef5e99ce8cb05a21b38a738c2ac28eb..d73a5636f4278f1dbb363cd579106cbd54763228 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj @@ -160,6 +160,7 @@ + @@ -173,6 +174,7 @@ + diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters index 9118afe697ead56e1a2174429114afaf8263852b..3cfc9236ccd338e9151471e88d75d2773017eb9d 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters @@ -1,10 +1,6 @@  - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd @@ -16,6 +12,10 @@ {9bf2e74a-551b-4d8d-ad34-ccd13e64e985} + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + {a205153f-6995-49dc-ae5f-cd2bc0d31549} @@ -54,6 +54,9 @@ 源文件 + + 源文件\XEngine_HTTPTask + @@ -89,5 +92,8 @@ 头文件 + + 头文件\XEngine_HTTPTask + \ No newline at end of file diff --git a/XEngine_Source/XEngine_UserProtocol.h b/XEngine_Source/XEngine_UserProtocol.h index 998475545fa7a248501410efa4d005fb424a82d1..d687cdd67d26e40aa6edaf79680a16ed616c9371 100644 --- a/XEngine_Source/XEngine_UserProtocol.h +++ b/XEngine_Source/XEngine_UserProtocol.h @@ -78,6 +78,15 @@ typedef enum ////////////////////////////////////////////////////////////////////////// #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MSG_TEXTREQ 0x0001 //发送消息 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MSG_TEXTREP 0x0002 //回复消息 +//P2XP协议 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REQLOGIN 0x6001 //登录 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REPLOGIN 0x6002 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REQLANLIST 0x6003 //同步列表协议,同步本地局域网IP中的客户端 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REPLANLIST 0x6004 //同步列表回复确认协议 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REQCONNECT 0x6005 //请求用户连接到网络服务 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REPCONNECT 0x6006 //确认连接协议 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REQUSERQUERY 0x6007 //用户查询 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REPUSERQUERY 0x6008 //用户查询确认 /////////////////////////////////////////////////////////////////////////// // 导出的数据结构 /////////////////////////////////////////////////////////////////////////// @@ -143,4 +152,23 @@ typedef struct TCHAR tszDestStr[1024]; //转换字符串 int enType; //简繁为ENUM_XENGINE_APISERVICE_LANGUAGE_TYPE 翻译为ENUM_XENGINE_APISERVICE_TRANSLATION_TYPE }XENGINE_LANGUAGEINFO; +//连接信息 +typedef struct +{ + CHAR tszUserName[64]; //用户信息 + CHAR tszPrivateAddr[32]; //私有本地地址,内网地址 + CHAR tszPublicAddr[32]; //外网地址 + CHAR tszConnectAddr[32]; //链接地址 + WORD dwConnectType; //连接类型 + WORD dwPeerType; //节点类型 +}XENGINE_P2XPPEER_PROTOCOL, * LPXENGINE_P2XPPEER_PROTOCOL; +//P2XP通道连接命令 +typedef struct tag_XEngine_P2XPIO_Protocol +{ + CHAR tszSourceUser[32]; //请求连接的用户 + CHAR tszDestUser[32]; //要连接的用户 + CHAR tszConnectAddr[32]; //连接的IP地址 + int nDestPort; //要连接的端口 + BOOL bIsTcp; //连接类型TCP,否则为UDP +}XENGINE_P2XPIO_PROTOCOL, * LPXENGINE_P2XPIO_PROTOCOL; #pragma pack(pop) \ No newline at end of file