From 1db0e9202a29ec54a822e40ab5b87f790239d015 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 22 Oct 2025 09:30:57 +0800 Subject: [PATCH 01/23] ci:fixed rocky build name --- .github/workflows/Rocky_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Rocky_build.yml b/.github/workflows/Rocky_build.yml index 12ebcfc..50aa58f 100644 --- a/.github/workflows/Rocky_build.yml +++ b/.github/workflows/Rocky_build.yml @@ -97,6 +97,6 @@ jobs: - name: Upload folder as artifact with CentOS uses: actions/upload-artifact@v4 with: - name: XEngine_MQServiceApp-CentOS_${{ matrix.version }}_${{ matrix.artifact }} + name: XEngine_MQServiceApp-RockyLinux_${{ matrix.version }}_${{ matrix.artifact }} path: XEngine_Release/ retention-days: 1 From 8788c210314f495a0c769eff395f5f000566263d Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 4 Nov 2025 13:39:15 +0800 Subject: [PATCH 02/23] update:depend library --- XEngine_Source/XEngine_DependLibrary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index 24bde9d..dc2e4b3 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit 24bde9d212cd48b822ad8aab90956033972ee46b +Subproject commit dc2e4b3af5b666e888166ef1e7567475f6f03904 From a30e76032f4b0a643e6a9dbcf89e75e2f14ed2d9 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 9 Feb 2026 13:44:11 +0800 Subject: [PATCH 03/23] update:depend library --- XEngine_Source/XEngine_DependLibrary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index dc2e4b3..adf48e2 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit dc2e4b3af5b666e888166ef1e7567475f6f03904 +Subproject commit adf48e22d68f741ec52f299945f8f8f8fb3df9d2 From 59f513d835fc7fa67f16360568485e02ae9b7a5d Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 9 Feb 2026 13:45:16 +0800 Subject: [PATCH 04/23] modify:does not case-sensitive --- XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp index 2c444f7..4efacdb 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp @@ -148,12 +148,12 @@ bool MessageQueue_Http_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST return false; } //判断请求 - if (0 == _tcsxnicmp(lpszPostMethod, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszPostMethod))) + if (0 == _tcsxncmp(lpszPostMethod, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszPostMethod))) { BaseLib_String_GetKeyValue(ppSt_ListUrl[0], _X("="), tszKey, tszValue); MessageQueue_HttpTask_Post(lpszClientAddr, tszValue, lpszMsgBuffer, nMsgLen); } - else if (0 == _tcsxnicmp(lpszGetMethod, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszGetMethod))) + else if (0 == _tcsxncmp(lpszGetMethod, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszGetMethod))) { BaseLib_String_GetKeyValue(ppSt_ListUrl[0], _X("="), tszKey, tszValue); MessageQueue_HttpTask_Get(lpszClientAddr, tszValue, &ppSt_ListUrl, nUrlCount); From 51fce304d377a9416e428fecaea0c3bef20ef272 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 9 Feb 2026 16:10:06 +0800 Subject: [PATCH 05/23] update:tcp app example --- XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp | 88 ++++++++++++++++---- 1 file changed, 73 insertions(+), 15 deletions(-) diff --git a/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp b/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp index 238db5a..5475518 100644 --- a/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp +++ b/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp @@ -3,6 +3,7 @@ #include #pragma comment(lib,"Ws2_32.lib") #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib.lib") +#pragma comment(lib,"XEngine_Core/XEngine_Cryption.lib") #pragma comment(lib,"XEngine_Client/XClient_Socket.lib") #endif #include @@ -15,18 +16,22 @@ using namespace std; #include #include #include +#include +#include #include #include #include "../../XEngine_Source/XQueue_ProtocolHdr.h" //VS2022 Debug x86 Compile -//g++ -std=c++17 -Wall -g MQCore_TCPApp.cpp -o MQCore_TCPApp.exe -lXEngine_BaseLib -lXClient_Socket +//g++ -std=c++17 -Wall -g MQCore_TCPApp.cpp -o MQCore_TCPApp.exe -lXEngine_BaseLib -lXEngine_Cryption -lXClient_Socket +#define XENGINE_CRYPTION_DATA_ENABLE 1 XSOCKET m_Socket; __int64x nLastNumber = 0; LPCXSTR lpszKey = _X("XEngine_CommKey"); //主题 LPCXSTR lpszUser = _X("123123aa"); LPCXSTR lpszPass = _X("123123"); +LPCXSTR lpszCryptKey = _X("123123aa"); //加解密密钥 void MQ_Authorize() { @@ -55,6 +60,10 @@ void MQ_Authorize() memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_ProtocolAuth, sizeof(XENGINE_PROTOCOL_USERAUTH)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif + if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); @@ -98,6 +107,10 @@ void MQ_GetUNRead(int nType = 0) memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif + if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); @@ -112,6 +125,9 @@ void MQ_GetUNRead(int nType = 0) memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); if (XClient_TCPSelect_RecvPkt(m_Socket, &ptszMsgBuffer, &nLen, &st_ProtocolHdr)) { +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); +#endif if (0 == st_ProtocolHdr.wReserve) { _xtprintf("接受到数据,长度:%d,内容:%s\n", st_ProtocolHdr.unPacketSize, ptszMsgBuffer); @@ -153,6 +169,9 @@ void MQ_Create() memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); @@ -229,6 +248,9 @@ void MQ_Post(LPCXSTR lpszMsgBuffer, int nType = 0, int nPubTime = -1, bool bSelf memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR) + sizeof(XENGINE_PROTOCOL_XMQ), lpszMsgBuffer, strlen(lpszMsgBuffer)); } +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); @@ -243,6 +265,10 @@ void MQ_Post(LPCXSTR lpszMsgBuffer, int nType = 0, int nPubTime = -1, bool bSelf _xtprintf("接受数据失败!\n"); return; } + +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); +#endif memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); memcpy(&st_XMQProtocol, ptszMsgBuffer, sizeof(XENGINE_PROTOCOL_XMQ)); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); @@ -279,6 +305,9 @@ void MQ_PostEMail(LPCXSTR lpszMsgBuffer) memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR) + sizeof(XENGINE_PROTOCOL_XMQ), lpszMsgBuffer, strlen(lpszMsgBuffer)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); @@ -293,6 +322,9 @@ void MQ_PostEMail(LPCXSTR lpszMsgBuffer) _xtprintf("接受数据失败!\n"); return; } +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); +#endif memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); memcpy(&st_XMQProtocol, ptszMsgBuffer, sizeof(XENGINE_PROTOCOL_XMQ)); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); @@ -323,6 +355,9 @@ void MQ_Get(int nType = 0) memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); @@ -338,6 +373,9 @@ void MQ_Get(int nType = 0) memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); if (XClient_TCPSelect_RecvPkt(m_Socket, &ptszMsgBuffer, &nLen, &st_ProtocolHdr)) { +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); +#endif memcpy(&st_XMQProtocol, ptszMsgBuffer, sizeof(XENGINE_PROTOCOL_XMQ)); if (0 == st_ProtocolHdr.wReserve) @@ -395,6 +433,9 @@ void MQ_TimePublish() memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR) + sizeof(XENGINE_PROTOCOL_XMQ), lpszMsgBuffer, _tcsxlen(lpszMsgBuffer)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); @@ -417,6 +458,10 @@ void MQ_TimePublish() memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); +#endif + memcpy(&st_XMQProtocol, ptszMsgBuffer, sizeof(st_XMQProtocol)); _xtprintf("接受到通知消息,主题:%s,序列:%lld,长度:%d,内容:%s\n", st_XMQProtocol.tszMQKey, st_XMQProtocol.nSerial, st_ProtocolHdr.unPacketSize - sizeof(XENGINE_PROTOCOL_XMQ), ptszMsgBuffer + sizeof(XENGINE_PROTOCOL_XMQ)); @@ -448,22 +493,27 @@ void MQ_GetNumber() memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); return; } - nLen = 2048; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nLen)) + nLen = 0; + XCHAR* ptszMsgBuffer = NULL; + memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); + + if (XClient_TCPSelect_RecvPkt(m_Socket, &ptszMsgBuffer, &nLen, &st_ProtocolHdr)) { - XENGINE_MQNUMBER st_MQNumber; - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_MQNumber, '\0', sizeof(XENGINE_MQNUMBER)); + XENGINE_MQNUMBER st_MQNumber = {}; - memcpy(&st_ProtocolHdr, tszMsgBuffer, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(&st_MQNumber, tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), sizeof(XENGINE_MQNUMBER)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); +#endif + memcpy(&st_MQNumber, ptszMsgBuffer, sizeof(XENGINE_MQNUMBER)); if (0 == st_ProtocolHdr.wReserve) { @@ -503,21 +553,26 @@ void MQ_BindTopic() memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); return; } - nLen = 2048; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nLen)) + nLen = 0; + XCHAR* ptszMsgBuffer = NULL; + memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); + if (XClient_TCPSelect_RecvPkt(m_Socket, &ptszMsgBuffer, &nLen, &st_ProtocolHdr)) { - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - memcpy(&st_ProtocolHdr, tszMsgBuffer, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(&st_XMQProtocol, tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), sizeof(XENGINE_PROTOCOL_XMQ)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); +#endif + memcpy(&st_XMQProtocol, ptszMsgBuffer, sizeof(XENGINE_PROTOCOL_XMQ)); if (0 == st_ProtocolHdr.wReserve) { @@ -556,6 +611,9 @@ void MQ_DeleteTopic() memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); From 8dac1809d3dae9560cdfb1240d161457008053db Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 9 Feb 2026 16:16:03 +0800 Subject: [PATCH 06/23] added:data transfer crypt --- .../MQCore_ConfigModule/Config_Define.h | 6 ++++++ .../Config_Json/Config_Json.cpp | 11 +++++++++++ .../MQService_HTTPTask/MQService_HTTPGet.cpp | 6 +++--- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 16 ++++++++-------- .../XEngine_MQServiceApp/MQService_Hdr.h | 3 +++ .../XEngine_MQServiceApp/MQService_MQTTTask.cpp | 4 ++++ .../XEngine_MQServiceApp/MQService_TCPTask.cpp | 4 ++++ .../XEngine_MQServiceApp/MQService_WSTask.cpp | 4 ++++ .../XEngine_MQServiceApp.cpp | 9 +++++++++ 9 files changed, 52 insertions(+), 11 deletions(-) diff --git a/XEngine_Source/MQCore_ConfigModule/Config_Define.h b/XEngine_Source/MQCore_ConfigModule/Config_Define.h index 05ae453..3e9c59a 100644 --- a/XEngine_Source/MQCore_ConfigModule/Config_Define.h +++ b/XEngine_Source/MQCore_ConfigModule/Config_Define.h @@ -91,6 +91,12 @@ typedef struct XCHAR tszAPIUrl[XPATH_MAX]; XCHAR tszServiceName[128]; }st_XReport; + struct + { + bool bEnable; + int nCryptionType; + XCHAR tszPassword[XPATH_MIN]; + }st_XCryption; struct { list *pStl_ListStorage; diff --git a/XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp b/XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp index 34bcad8..b5111bc 100644 --- a/XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp +++ b/XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp @@ -168,6 +168,17 @@ bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile,XENGINE_SERVERCONFIG pSt_ServerConfig->st_XReport.bEnable = st_JsonXReport["bEnable"].asBool(); _tcsxcpy(pSt_ServerConfig->st_XReport.tszAPIUrl, st_JsonXReport["tszAPIUrl"].asCString()); _tcsxcpy(pSt_ServerConfig->st_XReport.tszServiceName, st_JsonXReport["tszServiceName"].asCString()); + + if (st_JsonRoot["XCryption"].empty() || (3 != st_JsonRoot["XCryption"].size())) + { + Config_IsErrorOccur = true; + Config_dwErrorCode = ERROR_MQ_MODULE_CONFIG_JSON_XREPORT; + return false; + } + Json::Value st_JsonXCryption = st_JsonRoot["XCryption"]; + pSt_ServerConfig->st_XCryption.bEnable = st_JsonXCryption["bEnable"].asBool(); + pSt_ServerConfig->st_XCryption.nCryptionType = st_JsonXCryption["nCryptionType"].asInt(); + _tcsxcpy(pSt_ServerConfig->st_XCryption.tszPassword, st_JsonXCryption["tszPassword"].asCString()); return true; } bool CConfig_Json::Config_Json_VersionFile(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG* pSt_ServerConfig) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp index 230faf7..d14df99 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp @@ -20,7 +20,7 @@ bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, XCH LPCXSTR lpszAPIUPDate = _X("update"); LPCXSTR lpszAPIClose = _X("close"); - if (0 == _tcsxnicmp(lpszAPILogin, lpszFuncName, _tcsxlen(lpszAPILogin))) + if (0 == _tcsxncmp(lpszAPILogin, lpszFuncName, _tcsxlen(lpszAPILogin))) { //http://app.xyry.org:5202/api?function=login&user=123123aa&pass=123123 XNETHANDLE xhToken = 0; @@ -66,7 +66,7 @@ bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, XCH XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求登录获得TOKEN:%lld 成功,用户级别:%d"), lpszClientAddr, xhToken, st_UserInfo.nUserLevel); } - else if (0 == _tcsxnicmp(lpszAPIUPDate, lpszFuncName, _tcsxlen(lpszAPIUPDate))) + else if (0 == _tcsxncmp(lpszAPIUPDate, lpszFuncName, _tcsxlen(lpszAPIUPDate))) { //http://app.xyry.org:5202/api?function=update&token=1000112345 XCHAR tszUserToken[128]; @@ -85,7 +85,7 @@ bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, XCH XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求更新TOKEN:%s 成功"), lpszClientAddr, tszUserToken); } - else if (0 == _tcsxnicmp(lpszAPIClose, lpszFuncName, _tcsxlen(lpszAPIClose))) + else if (0 == _tcsxncmp(lpszAPIClose, lpszFuncName, _tcsxlen(lpszAPIClose))) { //http://app.xyry.org:5202/api?function=close&token=1000112345 XCHAR tszUserToken[128]; diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 7e75528..e21f14e 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -24,7 +24,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP LPCXSTR lpszAPIDelTopic = _X("deletetopic"); LPCXSTR lpszAPIDelUser = _X("deleteuser"); //判断请求 - if (0 == _tcsxnicmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister))) + if (0 == _tcsxncmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister))) { XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; if (!ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, &st_UserInfo)) @@ -86,7 +86,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求用户注册成功,用户名:%s,密码:%s"), lpszClientAddr, st_UserInfo.tszUserName, st_UserInfo.tszUserPass); } - else if (0 == _tcsxnicmp(lpszAPIGetUser, lpszFuncName, _tcsxlen(lpszAPIGetUser))) + else if (0 == _tcsxncmp(lpszAPIGetUser, lpszFuncName, _tcsxlen(lpszAPIGetUser))) { //用户 http://127.0.0.1:5202/api?function=getuser int nListCount = 0; @@ -97,7 +97,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP BaseLib_Memory_Free((XPPPMEM)&ppSt_UserInfo, nListCount); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取用户列表请求成功,获取到的用户列表个数:%d"), lpszClientAddr, nListCount); } - else if (0 == _tcsxnicmp(lpszAPIGetOnline, lpszFuncName, _tcsxlen(lpszAPIGetOnline))) + else if (0 == _tcsxncmp(lpszAPIGetOnline, lpszFuncName, _tcsxlen(lpszAPIGetOnline))) { //获取在线用户 http://127.0.0.1:5202/api?function=getonline int nType = 0; @@ -110,7 +110,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP BaseLib_Memory_Free((XPPPMEM)&pptszListAddr, nListCount); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); } - else if (0 == _tcsxnicmp(lpszAPIGetTopic, lpszFuncName, _tcsxlen(lpszAPIGetTopic))) + else if (0 == _tcsxncmp(lpszAPIGetTopic, lpszFuncName, _tcsxlen(lpszAPIGetTopic))) { //主题 http://127.0.0.1:5202/api?function=gettopic int nDBCount = 0; @@ -120,7 +120,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP ProtocolModule_Packet_TopicName(tszSDBuffer, &nSDLen, tszTopicName, nDBCount); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); } - else if (0 == _tcsxnicmp(lpszAPIGetList, lpszFuncName, _tcsxlen(lpszAPIGetList))) + else if (0 == _tcsxncmp(lpszAPIGetList, lpszFuncName, _tcsxlen(lpszAPIGetList))) { //主题 http://127.0.0.1:5202/api?function=getlist int nListCount = 0; @@ -131,7 +131,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取主题列表请求成功,获取到的主题列表个数:%d"), lpszClientAddr, nListCount); } - else if (0 == _tcsxnicmp(lpszAPICreateTopic, lpszFuncName, _tcsxlen(lpszAPICreateTopic))) + else if (0 == _tcsxncmp(lpszAPICreateTopic, lpszFuncName, _tcsxlen(lpszAPICreateTopic))) { //http://127.0.0.1:5202/api?function=createtopic @@ -146,7 +146,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_MQProtocol, sizeof(XENGINE_PROTOCOL_XMQ), XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求主题删除成功,主题名:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); } - else if (0 == _tcsxnicmp(lpszAPIDelTopic, lpszFuncName, _tcsxlen(lpszAPIDelTopic))) + else if (0 == _tcsxncmp(lpszAPIDelTopic, lpszFuncName, _tcsxlen(lpszAPIDelTopic))) { //http://127.0.0.1:5202/api?function=deletetopic @@ -161,7 +161,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_MQProtocol, sizeof(XENGINE_PROTOCOL_XMQ), XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求主题删除成功,主题名:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); } - else if (0 == _tcsxnicmp(lpszAPIDelUser, lpszFuncName, _tcsxlen(lpszAPIDelUser))) + else if (0 == _tcsxncmp(lpszAPIDelUser, lpszFuncName, _tcsxlen(lpszAPIDelUser))) { XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; if (!ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, &st_UserInfo)) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h index ee9ab7c..89e6ede 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h @@ -29,6 +29,8 @@ using namespace std; #include #include #include +#include +#include #include #include #include @@ -103,6 +105,7 @@ extern MESSAGEQUEUE_DBCONFIG st_DBConfig; #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib.lib") #pragma comment(lib,"XEngine_Core/XEngine_Core.lib") #pragma comment(lib,"XEngine_Core/XEngine_ManagePool.lib") +#pragma comment(lib,"XEngine_Core/XEngine_Cryption.lib") #pragma comment(lib,"XEngine_Client/XClient_APIHelp.lib") #pragma comment(lib,"XEngine_NetHelp/NetHelp_APIAddr.lib") #pragma comment(lib,"XEngine_HelpComponents/HelpComponents_XLog.lib") diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp index 332eb72..42ce395 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp @@ -24,6 +24,10 @@ XHTHREAD XCALLBACK MessageQueue_MQTTThread(XPVOID lParam) if (MQTTProtocol_Parse_Recv(ppSst_ListAddr[i]->tszClientAddr, &st_MQTTHdr, &ptszMSGBuffer, &nMSGLen)) { + if (st_ServiceCfg.st_XCryption.bEnable) + { + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMSGBuffer, &nMSGLen, st_ServiceCfg.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceCfg.st_XCryption.nCryptionType); + } MQService_MQTT_Handle(ppSst_ListAddr[i]->tszClientAddr, &st_MQTTHdr, ptszMSGBuffer, nMSGLen); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMSGBuffer); } diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp index 01a29e2..6cd294e 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp @@ -25,6 +25,10 @@ XHTHREAD XCALLBACK MessageQueue_TCPThread(XPVOID lParam) XCHAR* ptszMsgBuffer = NULL; if (HelpComponents_Datas_GetMemoryEx(xhTCPPacket, ppSst_ListAddr[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_ProtocolHdr)) { + if (st_ServiceCfg.st_XCryption.bEnable) + { + Cryption_Api_CryptDecodec(NULL, (XBYTE *)ptszMsgBuffer, &nMsgLen, st_ServiceCfg.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceCfg.st_XCryption.nCryptionType); + } MessageQueue_TCP_Handle(&st_ProtocolHdr, ppSst_ListAddr[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, XENGINE_MQAPP_NETTYPE_TCP); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_WSTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_WSTask.cpp index a8ceb30..d7ba68c 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_WSTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_WSTask.cpp @@ -23,6 +23,10 @@ XHTHREAD XCALLBACK MessageQueue_WebsocketThread(XPVOID lParam) ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE enOPCode; if (RfcComponents_WSPacket_GetMemoryEx(xhWSPacket, ppSst_ListAddr[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &enOPCode)) { + if (st_ServiceCfg.st_XCryption.bEnable) + { + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nMsgLen, st_ServiceCfg.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceCfg.st_XCryption.nCryptionType); + } MessageQueue_Websocket_Handle(ppSst_ListAddr[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, enOPCode); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } diff --git a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp index 30aa972..519d604 100644 --- a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp @@ -400,6 +400,15 @@ int main(int argc, char** argv) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,MQTT消息服务没有被启用")); } + + if (st_ServiceCfg.st_XCryption.bEnable) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,数据加密服务已被启用,加密类型:%d"), st_ServiceCfg.st_XCryption.nCryptionType); + } + else + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,数据加密服务没有被启用")); + } #ifndef _DEBUG //发送信息报告 if (st_ServiceCfg.st_XReport.bEnable && !bIsTest) From 8a47b4f4d92227e0927285f642854b20b9ff4ff0 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 9 Feb 2026 16:18:12 +0800 Subject: [PATCH 07/23] update:configure and make file --- XEngine_Release/XEngine_Config/XEngine_Config.json | 11 ++++++++--- XEngine_Source/XEngine_MQServiceApp/Makefile | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index d7e6a71..156fdb4 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -23,10 +23,10 @@ "LogType": 17 }, "XSql": { - "SQLAddr": "127.0.0.1", + "SQLAddr": "118.25.14.242", "SQLPort": 3306, "SQLUser": "root", - "SQLPass": "123123" + "SQLPass": "123123Qyt!" }, "XPass": { "nTimeout": 2, @@ -53,7 +53,7 @@ "tszEMailSubject": "XEngine MessageQueue Notify", "tszServiceAddr": "smtp://smtp.163.com", "tszUser": "ggqytgodlove@163.com", - "tszPass": "1" + "tszPass": "STZsBi3uuJvWsWL3" }, "SMSNotify": { "bEnable": false @@ -63,5 +63,10 @@ "bEnable": true, "tszServiceName": "XEngine_MQService", "tszAPIUrl": "http://app.xyry.org:5501/api?function=machine" + }, + "XCryption": { + "bEnable": true, + "nCryptionType": 1, + "tszPassword": "123123aa" } } \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/Makefile b/XEngine_Source/XEngine_MQServiceApp/Makefile index 92735b2..0059332 100644 --- a/XEngine_Source/XEngine_MQServiceApp/Makefile +++ b/XEngine_Source/XEngine_MQServiceApp/Makefile @@ -3,7 +3,7 @@ PLATVER = LOADHDR = -I ./ LOADSO = -L ../MQCore_ConfigModule -L ../MQCore_ProtocolModule -L ../MQCore_SessionModule -L ../MQCore_MemoryCache -L ../MQCore_DBModule -L ../MQCore_HelpModule \ -L ../XEngine_DependLibrary/XEngine_Module/jsoncpp -L ../XEngine_DependLibrary/XEngine_Module/XEngine_InfoReport -L ../XEngine_DependLibrary/XEngine_Module/XEngine_Token -L ../XEngine_DependLibrary/XEngine_Module/XEngine_Verification -L ../XEngine_DependLibrary/XEngine_Module/XEngine_MSGNotify -LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXClient_APIHelp -lNetHelp_APIAddr -lXEngine_SystemApi -lHelpComponents_XLog -lHelpComponents_Packets -lRfcComponents_WSProtocol -lRfcComponents_HttpProtocol -lRfcComponents_MQTTProtocol \ +LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXEngine_Cryption -lXClient_APIHelp -lNetHelp_APIAddr -lXEngine_SystemApi -lHelpComponents_XLog -lHelpComponents_Packets -lRfcComponents_WSProtocol -lRfcComponents_HttpProtocol -lRfcComponents_MQTTProtocol \ -lMQCore_ConfigModule -lMQCore_ProtocolModule -lMQCore_SessionModule -lMQCore_MemoryCache -lMQCore_DBModule -lMQCore_HelpModule \ -ljsoncpp -lXEngine_InfoReport -lXEngine_Token -lXEngine_Verification -lXEngine_MSGNotify LIBEX = From a7322b9d8ecc34b3078858e17f73000d9116c5b6 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 9 Feb 2026 17:31:47 +0800 Subject: [PATCH 08/23] modify:Reconstruct the TCP and HTTP protocols; now the data processed by the HTTP protocol is no longer handed over to the TCP for processing --- XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp | 2 +- .../XEngine_Config/XEngine_Config.json | 2 +- .../MQCore_ProtocolModule.def | 2 +- .../ProtocolModule_Parse.cpp | 29 +++- .../ProtocolModule_Parse.h | 2 +- .../MQCore_ProtocolModule/Protocol_Define.h | 8 +- XEngine_Source/MQCore_ProtocolModule/pch.cpp | 4 +- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 139 +++++++++++++--- .../MQService_TCPTask.cpp | 151 ++---------------- XEngine_Source/XQueue_ProtocolHdr.h | 9 +- 10 files changed, 163 insertions(+), 185 deletions(-) diff --git a/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp b/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp index 5475518..c4100ac 100644 --- a/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp +++ b/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp @@ -24,7 +24,7 @@ using namespace std; //VS2022 Debug x86 Compile //g++ -std=c++17 -Wall -g MQCore_TCPApp.cpp -o MQCore_TCPApp.exe -lXEngine_BaseLib -lXEngine_Cryption -lXClient_Socket -#define XENGINE_CRYPTION_DATA_ENABLE 1 +#define XENGINE_CRYPTION_DATA_ENABLE 0 XSOCKET m_Socket; __int64x nLastNumber = 0; diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index 156fdb4..8e4a4f5 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -65,7 +65,7 @@ "tszAPIUrl": "http://app.xyry.org:5501/api?function=machine" }, "XCryption": { - "bEnable": true, + "bEnable": false, "nCryptionType": 1, "tszPassword": "123123aa" } diff --git a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def index f0d3201..3c53028 100644 --- a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def +++ b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def @@ -21,4 +21,4 @@ EXPORTS ProtocolModule_Parse_Register ProtocolModule_Parse_Token ProtocolModule_Parse_Type - ProtocolModule_Parse_Name \ No newline at end of file + ProtocolModule_Parse_XMQ \ No newline at end of file diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp index c5267aa..51713b4 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp @@ -421,17 +421,17 @@ bool CProtocolModule_Parse::ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int 类型:整数型 可空:N 意思:要解析的大小 - 参数.三:ptszMSGBuffer + 参数.三:pSt_XMQProtocol In/Out:Out - 类型:字符指针 + 类型:数据结构指针 可空:N - 意思:输出解析到的名称 + 意思:输出解析的XMQ协议 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -bool CProtocolModule_Parse::ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszMSGBuffer) +bool CProtocolModule_Parse::ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_XMQ* pSt_XMQProtocol) { Protocol_IsErrorOccur = false; @@ -453,10 +453,25 @@ bool CProtocolModule_Parse::ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int return false; } Json::Value st_JsonObject = st_JsonRoot["Object"]; - if (!st_JsonObject["name"].isNull()) + if (!st_JsonObject["tszMQKey"].isNull()) { - _tcsxcpy(ptszMSGBuffer, st_JsonObject["name"].asCString()); + _tcsxcpy(pSt_XMQProtocol->tszMQKey, st_JsonObject["tszMQKey"].asCString()); + } + if (!st_JsonObject["tszMQUsr"].isNull()) + { + _tcsxcpy(pSt_XMQProtocol->tszMQUsr, st_JsonObject["tszMQUsr"].asCString()); + } + if (!st_JsonObject["nKeepTime"].isNull()) + { + pSt_XMQProtocol->nKeepTime = st_JsonObject["nKeepTime"].asInt(); + } + if (!st_JsonObject["nPubTime"].isNull()) + { + pSt_XMQProtocol->nPubTime = st_JsonObject["nPubTime"].asInt(); + } + if (!st_JsonObject["nSerial"].isNull()) + { + pSt_XMQProtocol->nSerial = st_JsonObject["nSerial"].asInt(); } - return true; } \ No newline at end of file diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h index d503748..a5977cf 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h @@ -21,7 +21,7 @@ class CProtocolModule_Parse bool ProtocolModule_Parse_Register(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERINFO* pSt_UserInfo); bool ProtocolModule_Parse_Token(LPCXSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE* pxhToken); bool ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int nMsgLen, int* pInt_Type); - bool ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszMSGBuffer); + bool ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_XMQ* pSt_XMQProtocol); protected: private: }; diff --git a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h index 1bdc723..5a4030c 100644 --- a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h +++ b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h @@ -521,14 +521,14 @@ extern "C" bool ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int nMsgLen, in 类型:整数型 可空:N 意思:要解析的大小 - 参数.三:ptszMSGBuffer + 参数.三:pSt_XMQProtocol In/Out:Out - 类型:字符指针 + 类型:数据结构指针 可空:N - 意思:输出解析到的名称 + 意思:输出解析的XMQ协议 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszMSGBuffer); \ No newline at end of file +extern "C" bool ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_XMQ* pSt_XMQProtocol); \ No newline at end of file diff --git a/XEngine_Source/MQCore_ProtocolModule/pch.cpp b/XEngine_Source/MQCore_ProtocolModule/pch.cpp index ee4b5f7..7f57a42 100644 --- a/XEngine_Source/MQCore_ProtocolModule/pch.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/pch.cpp @@ -102,7 +102,7 @@ extern "C" bool ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int nMsgLen, in { return m_ProtocolParse.ProtocolModule_Parse_Type(lpszMsgBuffer, nMsgLen, pInt_Type); } -extern "C" bool ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszMSGBuffer) +extern "C" bool ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_XMQ* pSt_XMQProtocol) { - return m_ProtocolParse.ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, ptszMSGBuffer); + return m_ProtocolParse.ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, pSt_XMQProtocol); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index e21f14e..50f39ed 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -23,6 +23,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP LPCXSTR lpszAPICreateTopic = _X("createtopic"); LPCXSTR lpszAPIDelTopic = _X("deletetopic"); LPCXSTR lpszAPIDelUser = _X("deleteuser"); + LPCXSTR lpszAPIDelMsg = _X("deletemsg"); //判断请求 if (0 == _tcsxncmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister))) { @@ -36,7 +37,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP } if (DBModule_MQUser_UserQuery(&st_UserInfo)) { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_EXISTED, _X("user is existed")); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_EXIST, _X("user is existed")); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求用户注册失败,用户已经存在,错误:%lX"), lpszClientAddr, SessionModule_GetLastError()); return false; @@ -114,10 +115,11 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP { //主题 http://127.0.0.1:5202/api?function=gettopic int nDBCount = 0; - XCHAR tszTopicName[XPATH_MAX] = {}; - ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, tszTopicName); - DBModule_MQData_GetLeftCount(tszTopicName, 0, &nDBCount); - ProtocolModule_Packet_TopicName(tszSDBuffer, &nSDLen, tszTopicName, nDBCount); + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + + ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol); + DBModule_MQData_GetLeftCount(st_MQProtocol.tszMQKey, 0, &nDBCount); + ProtocolModule_Packet_TopicName(tszSDBuffer, &nSDLen, st_MQProtocol.tszMQKey, nDBCount); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); } else if (0 == _tcsxncmp(lpszAPIGetList, lpszFuncName, _tcsxlen(lpszAPIGetList))) @@ -134,33 +136,126 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP else if (0 == _tcsxncmp(lpszAPICreateTopic, lpszFuncName, _tcsxlen(lpszAPICreateTopic))) { //http://127.0.0.1:5202/api?function=createtopic - XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - XENGINE_PROTOCOLHDR st_ProtocolHdr = {}; - ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, st_MQProtocol.tszMQKey); - APIHelp_MQHelp_JsonToHex(&st_ProtocolHdr); + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("request json parse failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求的创建主题失败,数据不正确:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + int nListCount = 0; + XCHAR** ppszTableName; + //检查表是否存在 + DBModule_MQData_ShowTable(&ppszTableName, &nListCount); + for (int i = 0; i < nListCount; i++) + { + if (0 == _tcsxnicmp(ppszTableName[i], st_MQProtocol.tszMQKey, _tcsxlen(ppszTableName[i]))) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_EXIST, _X("topic name is exist")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,创建主题失败,主题名称:%s,主题存在,无法继续"), lpszClientAddr, st_MQProtocol.tszMQKey); + return false; + } + } + BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); + //创建表 + if (!DBModule_MQData_CreateTable(st_MQProtocol.tszMQKey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_SERVICE, _X("create topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,创建主题失败,创建表失败,主题名称:%s,无法继续,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); + return false; + } + //插入所有者 + XENGINE_DBTOPICOWNER st_DBOwner; + memset(&st_DBOwner, '\0', sizeof(XENGINE_DBTOPICOWNER)); + + _tcsxcpy(st_DBOwner.tszUserName, st_MQProtocol.tszMQUsr); + _tcsxcpy(st_DBOwner.tszQueueName, st_MQProtocol.tszMQKey); - st_ProtocolHdr.xhToken = xhToken; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICCREATE; - MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_MQProtocol, sizeof(XENGINE_PROTOCOL_XMQ), XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求主题删除成功,主题名:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); + if (!DBModule_MQUser_OwnerInsert(&st_DBOwner)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_SERVICE, _X("create topic bind with user is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,创建主题失败,插入所有者失败,主题名称:%s,无法继续,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); + return false; + } + //回复 + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,主题:%s,创建主题成功"), lpszClientAddr, st_MQProtocol.tszMQKey); } else if (0 == _tcsxncmp(lpszAPIDelTopic, lpszFuncName, _tcsxlen(lpszAPIDelTopic))) { //http://127.0.0.1:5202/api?function=deletetopic - + XENGINE_DBTOPICOWNER st_DBOwner = {}; + XENGINE_DBUSERKEY st_UserKey = {}; + XENGINE_DBTIMERELEASE st_DBInfo = {}; XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - XENGINE_PROTOCOLHDR st_ProtocolHdr = {}; - - ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, st_MQProtocol.tszMQKey); - APIHelp_MQHelp_JsonToHex(&st_ProtocolHdr); - - st_ProtocolHdr.xhToken = xhToken; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICDELETE; - MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_MQProtocol, sizeof(XENGINE_PROTOCOL_XMQ), XENGINE_MQAPP_NETTYPE_HTTP); + + ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol); + + _tcsxcpy(st_DBOwner.tszUserName, st_MQProtocol.tszMQUsr); + _tcsxcpy(st_DBOwner.tszQueueName, st_MQProtocol.tszMQKey); + _tcsxcpy(st_UserKey.tszKeyName, st_MQProtocol.tszMQKey); + _tcsxcpy(st_DBInfo.tszQueueName, st_MQProtocol.tszMQKey); + + if (_tcsxlen(st_DBOwner.tszUserName) <= 0) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_MISS, _X("user name missing")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,删除主题失败,删除所有者失败,主题名称:%s,用户名为空"), lpszClientAddr, st_MQProtocol.tszMQKey, st_DBOwner.tszUserName); + return false; + } + if (!DBModule_MQUser_OwnerDelete(&st_DBOwner)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_SERVICE, _X("delete owner db failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,删除主题失败,删除所有者失败,主题名称:%s,无法继续,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); + return false; + } + //清楚数据库 + APIHelp_Counter_SerialDel(st_MQProtocol.tszMQKey); + DBModule_MQData_DeleteTable(st_MQProtocol.tszMQKey); + DBModule_MQUser_KeyDelete(&st_UserKey); + DBModule_MQUser_TimeDelete(&st_DBInfo); + + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求主题删除成功,主题名:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); } + else if (0 == _tcsxncmp(lpszAPIDelMsg, lpszFuncName, _tcsxlen(lpszAPIDelMsg))) + { + //http://127.0.0.1:5202/api?function=deletemsg + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + XENGINE_DBMESSAGEQUEUE st_MessageQueue = {}; + + ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol); + + if (st_MQProtocol.nSerial <= 0) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_MISS, _X("message serial not set")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,主题:%s,删除消息数据失败,删除指定消息序列:%lld 失败"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial); + return false; + } + st_MessageQueue.nQueueSerial = st_MQProtocol.nSerial; + _tcsxcpy(st_MessageQueue.tszQueueName, st_MQProtocol.tszMQKey); + if (!DBModule_MQData_Delete(&st_MessageQueue)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_SERVICE, _X("message delete failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,主题:%s,删除消息数据失败,删除指定消息序列:%lld 失败,错误码:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); + return false; + } + + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,删除消息数据成功主题:%s,序列:%lld,"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MessageQueue.nQueueSerial); + } else if (0 == _tcsxncmp(lpszAPIDelUser, lpszFuncName, _tcsxlen(lpszAPIDelUser))) { XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp index 6cd294e..2897c9d 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp @@ -215,6 +215,12 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC if (!SessionModule_Client_GetUser(lpszClientAddr, tszUserName)) { pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_AUTH_NOTLOGIN; + + if (st_ServiceCfg.st_XCryption.bEnable) + { + nSDLen = sizeof(XENGINE_PROTOCOL_XMQ); + Cryption_Api_CryptEncodec(NULL, (XBYTE*)&st_MQProtocol, &nSDLen, st_ServiceCfg.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceCfg.st_XCryption.nCryptionType); + } ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s客户端:%s,请求失败,用户没有通过验证"), lpszClientType, lpszClientAddr); @@ -273,6 +279,12 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC if (pSt_ProtocolHdr->byIsReply) { pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_EXISTED; + + if (st_ServiceCfg.st_XCryption.bEnable) + { + nSDLen = sizeof(XENGINE_PROTOCOL_XMQ); + Cryption_Api_CryptEncodec(NULL, (XBYTE*)&st_MQProtocol, &nSDLen, st_ServiceCfg.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceCfg.st_XCryption.nCryptionType); + } ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); } @@ -564,145 +576,6 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,主题:%s,序列:%lld,获取消息数据成功,消息大小:%d"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MessageQueue.nQueueSerial, st_MessageQueue.nMsgLen); } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQDELETE == pSt_ProtocolHdr->unOperatorCode) - { - XENGINE_DBMESSAGEQUEUE st_MessageQueue; - memset(&st_MessageQueue, '\0', sizeof(XENGINE_DBMESSAGEQUEUE)); - - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPDELETE; - if (st_MQProtocol.nSerial <= 0) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_SERIAL; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,主题:%s,删除消息数据失败,删除指定消息序列:%lld 失败,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); - return false; - } - st_MessageQueue.nQueueSerial = st_MQProtocol.nSerial; - _tcsxcpy(st_MessageQueue.tszQueueName, st_MQProtocol.tszMQKey); - DBModule_MQData_Delete(&st_MessageQueue); - - pSt_ProtocolHdr->wReserve = 0; - pSt_ProtocolHdr->byVersion = st_MessageQueue.byMsgType; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,主题:%s,序列:%lld,删除消息数据成功"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MessageQueue.nQueueSerial); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICCREATE == pSt_ProtocolHdr->unOperatorCode) - { - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICCREATE; - - int nListCount = 0; - XCHAR** ppszTableName; - //检查表是否存在 - DBModule_MQData_ShowTable(&ppszTableName, &nListCount); - for (int i = 0; i < nListCount; i++) - { - if (0 == _tcsxnicmp(ppszTableName[i], st_MQProtocol.tszMQKey, _tcsxlen(ppszTableName[i]))) - { - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_EXISTED; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,创建主题失败,主题名称:%s,主题存在,无法继续"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey); - return false; - } - } - BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); - //创建表 - if (!DBModule_MQData_CreateTable(st_MQProtocol.tszMQKey)) - { - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_CREATEKEY; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,创建主题失败,创建表失败,主题名称:%s,无法继续,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); - return false; - } - //插入所有者 - XENGINE_DBTOPICOWNER st_DBOwner; - memset(&st_DBOwner, '\0', sizeof(XENGINE_DBTOPICOWNER)); - - _tcsxcpy(st_DBOwner.tszUserName, tszUserName); - _tcsxcpy(st_DBOwner.tszQueueName, st_MQProtocol.tszMQKey); - - if (!DBModule_MQUser_OwnerInsert(&st_DBOwner)) - { - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_BINDOWNER; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,创建主题失败,插入所有者失败,主题名称:%s,无法继续,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); - return false; - } - //回复 - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = 0; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,主题:%s,创建主题成功"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICDELETE == pSt_ProtocolHdr->unOperatorCode) - { - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICDELETE; - //清理所有者 - XENGINE_DBTOPICOWNER st_DBOwner; - XENGINE_DBUSERKEY st_UserKey; - XENGINE_DBTIMERELEASE st_DBInfo; - - memset(&st_DBOwner, '\0', sizeof(XENGINE_DBTOPICOWNER)); - memset(&st_UserKey, '\0', sizeof(XENGINE_DBUSERKEY)); - memset(&st_DBInfo, '\0', sizeof(XENGINE_DBTIMERELEASE)); - - _tcsxcpy(st_DBOwner.tszUserName, tszUserName); - _tcsxcpy(st_DBOwner.tszQueueName, st_MQProtocol.tszMQKey); - _tcsxcpy(st_UserKey.tszKeyName, st_MQProtocol.tszMQKey); - _tcsxcpy(st_DBInfo.tszQueueName, st_MQProtocol.tszMQKey); - - if (_tcsxlen(st_DBOwner.tszUserName) <= 0) - { - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_DELOWNER; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,删除主题失败,删除所有者失败,主题名称:%s,用户名为空"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, tszUserName); - return false; - } - if (!DBModule_MQUser_OwnerDelete(&st_DBOwner)) - { - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_DELOWNER; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,删除主题失败,删除所有者失败,主题名称:%s,无法继续,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); - return false; - } - //清楚数据库 - APIHelp_Counter_SerialDel(st_MQProtocol.tszMQKey); - DBModule_MQData_DeleteTable(st_MQProtocol.tszMQKey); - DBModule_MQUser_KeyDelete(&st_UserKey); - DBModule_MQUser_TimeDelete(&st_DBInfo); - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = 0; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,主题:%s,删除主题成功"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey); - } else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND == pSt_ProtocolHdr->unOperatorCode) { pSt_ProtocolHdr->wReserve = 0; diff --git a/XEngine_Source/XQueue_ProtocolHdr.h b/XEngine_Source/XQueue_ProtocolHdr.h index 6cbf109..f7ed219 100644 --- a/XEngine_Source/XQueue_ProtocolHdr.h +++ b/XEngine_Source/XQueue_ProtocolHdr.h @@ -24,18 +24,12 @@ #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPPOST 0x7001 //投递包回复 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQGET 0x7002 //获取包请求 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPGET 0x7003 //获取包回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQDELETE 0x7004 //消息删除请求 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPDELETE 0x7005 //消息删除回复 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQMODIFY 0x7006 //消息修改请求 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPMODIFY 0x7007 //消息修改回复 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQNUMBER 0x7008 //请求消息队列编号信息 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPNUMBER 0x7009 //回复 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUNREAD 0x7010 //请求未读消息 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPUNREAD 0x7011 //响应未读消息 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICCREATE 0x7100 //主题创建请求 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICCREATE 0x7101 //主题创建回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICDELETE 0x7102 //主题删除请求 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICDELETE 0x7103 //主题删除回复 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICMODIFY 0x7104 //主题名修改请求 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICMODIFY 0x7105 //主题名修改回复 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND 0x7106 //请求主题绑定操作 @@ -76,10 +70,11 @@ #define ERROR_XENGINE_MESSAGE_HTTP_PARSE 0x204 //解析失败,负载协议错误 #define ERROR_XENGINE_MESSAGE_HTTP_SERVICE 0x205 //服务器错误 #define ERROR_XENGINE_MESSAGE_HTTP_APIREG 0x206 //HTTP 远程注册失败 -#define ERROR_XENGINE_MESSAGE_HTTP_EXISTED 0x207 //用户已经存在 #define ERROR_XENGINE_MESSAGE_HTTP_REGISTER 0x208 //用户注册失败,数据错误 #define ERROR_XENGINE_MESSAGE_HTTP_APIDEL 0x209 //HTTP API删除失败 #define ERROR_XENGINE_MESSAGE_HTTP_DELETE 0x210 //本地删除失败 +#define ERROR_XENGINE_MESSAGE_HTTP_MISS 0x211 //缺少关键数据 +#define ERROR_XENGINE_MESSAGE_HTTP_EXIST 0x212 //数据已存在 /////////////////////////////////////////////////////////////////////////// // 导出的数据结构 /////////////////////////////////////////////////////////////////////////// From f5ff11dfcb3ec5a5fc49d02fa6df1034507da5a6 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 10 Feb 2026 14:12:03 +0800 Subject: [PATCH 09/23] modify:message and topic modify and request message number to http protocol --- .../MQCore_ProtocolModule.def | 4 +- .../ProtocolModule_Packet.cpp | 63 +++---- .../ProtocolModule_Packet.h | 2 +- .../ProtocolModule_Parse.cpp | 155 ++++++++++++++++++ .../ProtocolModule_Parse.h | 2 + .../MQCore_ProtocolModule/Protocol_Define.h | 84 ++++++++-- XEngine_Source/MQCore_ProtocolModule/pch.cpp | 12 +- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 101 ++++++++++++ .../MQService_TCPTask.cpp | 124 -------------- XEngine_Source/XQueue_ProtocolHdr.h | 7 +- 10 files changed, 358 insertions(+), 196 deletions(-) diff --git a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def index 3c53028..c11ae9d 100644 --- a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def +++ b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def @@ -21,4 +21,6 @@ EXPORTS ProtocolModule_Parse_Register ProtocolModule_Parse_Token ProtocolModule_Parse_Type - ProtocolModule_Parse_XMQ \ No newline at end of file + ProtocolModule_Parse_XMQ + ProtocolModule_Parse_MessageQueue + ProtocolModule_Parse_ModifyTopic \ No newline at end of file diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp index a63e3e9..04a4a62 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp @@ -88,76 +88,51 @@ bool CProtocolModule_Packet::ProtocolModule_Packet_Common(int nNetType, XENGINE_ /******************************************************************** 函数名称:ProtocolModule_Packet_MQNumber 函数功能:获取序列打包函数 - 参数.一:pSt_ProtocolHdr - In/Out:In - 类型:数据结构指针 - 可空:N - 意思:输入协议头 - 参数.二:pSt_MQNumber - In/Out:In - 类型:数据结构指针 - 可空:N - 意思:输入要打包的序列号信息 - 参数.三:ptszMsgBuffer + 参数.一:ptszMsgBuffer In/Out:Out 类型:字符指针 可空:N 意思:输出打好包的缓冲区 - 参数.四:pInt_MsgLen + 参数.二:pInt_MsgLen In/Out:Out 类型:整数型指针 可空:N 意思:输出缓冲区大小 - 参数.五:nNetType - In/Out:Out - 类型:整数型 + 参数.三:pSt_MQNumber + In/Out:In + 类型:数据结构指针 可空:N - 意思:输入网络类型 + 意思:输入要打包的序列号信息 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -bool CProtocolModule_Packet::ProtocolModule_Packet_MQNumber(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_MQNUMBER* pSt_MQNumber, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nNetType) +bool CProtocolModule_Packet::ProtocolModule_Packet_MQNumber(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_MQNUMBER* pSt_MQNumber) { Protocol_IsErrorOccur = false; - if ((NULL == pSt_ProtocolHdr) || (NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARAMENT; return false; } + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + Json::StreamWriterBuilder st_JsonBuilder; - if (XENGINE_MQAPP_NETTYPE_TCP == nNetType) - { - pSt_ProtocolHdr->unPacketSize = sizeof(XENGINE_MQNUMBER); - memcpy(ptszMsgBuffer, pSt_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(ptszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), pSt_MQNumber, sizeof(XENGINE_MQNUMBER)); - *pInt_MsgLen = sizeof(XENGINE_PROTOCOLHDR) + sizeof(XENGINE_MQNUMBER); - } - else - { - Json::Value st_JsonRoot; - Json::Value st_JsonObject; - Json::StreamWriterBuilder st_JsonBuilder; - - st_JsonRoot["unOperatorType"] = pSt_ProtocolHdr->unOperatorType; - st_JsonRoot["unOperatorCode"] = pSt_ProtocolHdr->unOperatorCode; - st_JsonRoot["wReserve"] = pSt_ProtocolHdr->wReserve; + st_JsonObject["tszMQKey"] = pSt_MQNumber->tszMQKey; + st_JsonObject["nCount"] = (Json::Value::Int64)pSt_MQNumber->nCount; + st_JsonObject["nFirstNumber"] = (Json::Value::Int64)pSt_MQNumber->nFirstNumber; + st_JsonObject["nLastNumber"] = (Json::Value::Int64)pSt_MQNumber->nLastNumber; - st_JsonObject["tszMQKey"] = pSt_MQNumber->tszMQKey; - st_JsonObject["nCount"] = (Json::Value::Int64)pSt_MQNumber->nCount; - st_JsonObject["nFirstNumber"] = (Json::Value::Int64)pSt_MQNumber->nFirstNumber; - st_JsonObject["nLastNumber"] = (Json::Value::Int64)pSt_MQNumber->nLastNumber; - - st_JsonRoot["st_MQNumber"] = st_JsonObject; + st_JsonRoot["st_MQNumber"] = st_JsonObject; - st_JsonBuilder["emitUTF8"] = true; + 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); - } + *pInt_MsgLen = Json::writeString(st_JsonBuilder, st_JsonRoot).length(); + memcpy(ptszMsgBuffer, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), *pInt_MsgLen); return true; } /******************************************************************** diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h index 3721aae..8c332db 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h @@ -26,7 +26,7 @@ class CProtocolModule_Packet ~CProtocolModule_Packet(); public: bool ProtocolModule_Packet_Common(int nNetType, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_PROTOCOL_XMQ* pSt_MQProtocol, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszMsgBuffer = NULL, int nMsgLen = 0); - bool ProtocolModule_Packet_MQNumber(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_MQNUMBER* pSt_MQNumber, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nNetType); + bool ProtocolModule_Packet_MQNumber(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_MQNUMBER* pSt_MQNumber); bool ProtocolModule_Packet_PassAuth(XENGINE_PROTOCOL_USERAUTH* pSt_ProtocolAuth, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nCode); bool ProtocolModule_Packet_PassUser(XENGINE_PROTOCOL_USERINFO* pSt_ProtocolUser, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nCode); bool ProtocolModule_Packet_PassHttp(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszToken, LPCXSTR lpszAPIUser, LPCXSTR lpszURIApi); diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp index 51713b4..5d0c500 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp @@ -474,4 +474,159 @@ bool CProtocolModule_Parse::ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int pSt_XMQProtocol->nSerial = st_JsonObject["nSerial"].asInt(); } return true; +} +/******************************************************************** +函数名称:ProtocolModule_Parse_MessageQueue +函数功能:解析消息数据协议 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:pSt_MQMessage + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出解析的消息协议 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CProtocolModule_Parse::ProtocolModule_Parse_MessageQueue(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_DBMESSAGEQUEUE* pSt_MQMessage) +{ + Protocol_IsErrorOccur = false; + if ((NULL == lpszMsgBuffer)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARAMENT; + return false; + } + Json::Value st_JsonRoot; + JSONCPP_STRING st_JsonError; + Json::CharReaderBuilder st_ReaderBuilder; + std::unique_ptr const pSt_JsonReader(st_ReaderBuilder.newCharReader()); + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARSE; + return false; + } + Json::Value st_JsonObject = st_JsonRoot["Object"]; + + if (!st_JsonObject["byMsgType"].isNull()) + { + pSt_MQMessage->byMsgType = st_JsonObject["byMsgType"].asInt(); + } + if (!st_JsonObject["nMsgAttr"].isNull()) + { + XSHOT nMsgAttr = st_JsonObject["nMsgAttr"].asUInt(); + memcpy(&pSt_MQMessage->nMsgAttr, &nMsgAttr, sizeof(XENGINE_PROTOCOL_MSGATTR)); + } + if (!st_JsonObject["nQueueSerial"].isNull()) + { + pSt_MQMessage->nQueueSerial = st_JsonObject["nQueueSerial"].asInt64(); + } + if (!st_JsonObject["nMsgLen"].isNull()) + { + pSt_MQMessage->nMsgLen = st_JsonObject["nMsgLen"].asInt(); + } + if (!st_JsonObject["tszMsgBuffer"].isNull()) + { + _tcsxcpy(pSt_MQMessage->tszMsgBuffer, st_JsonObject["tszMsgBuffer"].asCString()); + } + if (!st_JsonObject["tszUserName"].isNull()) + { + _tcsxcpy(pSt_MQMessage->tszUserName, st_JsonObject["tszUserName"].asCString()); + } + if (!st_JsonObject["tszUserBelong"].isNull()) + { + _tcsxcpy(pSt_MQMessage->tszUserBelong, st_JsonObject["tszUserBelong"].asCString()); + } + if (!st_JsonObject["tszQueueName"].isNull()) + { + _tcsxcpy(pSt_MQMessage->tszQueueName, st_JsonObject["tszQueueName"].asCString()); + } + if (!st_JsonObject["tszQueueLeftTime"].isNull()) + { + _tcsxcpy(pSt_MQMessage->tszQueueLeftTime, st_JsonObject["tszQueueLeftTime"].asCString()); + } + if (!st_JsonObject["tszQueuePublishTime"].isNull()) + { + _tcsxcpy(pSt_MQMessage->tszQueuePublishTime, st_JsonObject["tszQueuePublishTime"].asCString()); + } + return true; +} +/******************************************************************** +函数名称:ProtocolModule_Parse_ModifyTopic +函数功能:解析修改主题协议 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:ptszSrcTopic + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出原始主题名称 + 参数.四:ptszDstTopic + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出目标主题名称 + 参数.五:ptszUser + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出所属用户 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CProtocolModule_Parse::ProtocolModule_Parse_ModifyTopic(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszSrcTopic, XCHAR* ptszDstTopic, XCHAR* ptszUser) +{ + Protocol_IsErrorOccur = false; + + if (NULL == lpszMsgBuffer) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARAMENT; + return false; + } + Json::Value st_JsonRoot; + JSONCPP_STRING st_JsonError; + Json::CharReaderBuilder st_ReaderBuilder; + std::unique_ptr const pSt_JsonReader(st_ReaderBuilder.newCharReader()); + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARSE; + return false; + } + Json::Value st_JsonObject = st_JsonRoot["Object"]; + if (!st_JsonObject["tszSrcTopic"].isNull()) + { + _tcsxcpy(ptszSrcTopic, st_JsonObject["tszSrcTopic"].asCString()); + } + if (!st_JsonObject["tszDstTopic"].isNull()) + { + _tcsxcpy(ptszDstTopic, st_JsonObject["tszDstTopic"].asCString()); + } + if (!st_JsonObject["tszUser"].isNull()) + { + _tcsxcpy(ptszUser, st_JsonObject["tszUser"].asCString()); + } + return true; } \ No newline at end of file diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h index a5977cf..bdac465 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h @@ -22,6 +22,8 @@ class CProtocolModule_Parse bool ProtocolModule_Parse_Token(LPCXSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE* pxhToken); bool ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int nMsgLen, int* pInt_Type); bool ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_XMQ* pSt_XMQProtocol); + bool ProtocolModule_Parse_MessageQueue(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_DBMESSAGEQUEUE* pSt_MQMessage); + bool ProtocolModule_Parse_ModifyTopic(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszSrcTopic, XCHAR* ptszDstTopic, XCHAR* ptszUser); protected: private: }; diff --git a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h index 5a4030c..8450082 100644 --- a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h +++ b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h @@ -64,37 +64,27 @@ extern "C" bool ProtocolModule_Packet_Common(int nNetType, XENGINE_PROTOCOLHDR* /******************************************************************** 函数名称:ProtocolModule_Packet_MQNumber 函数功能:获取序列打包函数 - 参数.一:pSt_ProtocolHdr - In/Out:In - 类型:数据结构指针 - 可空:N - 意思:输入协议头 - 参数.二:pSt_MQNumber - In/Out:In - 类型:数据结构指针 - 可空:N - 意思:输入要打包的序列号信息 - 参数.三:ptszMsgBuffer + 参数.一:ptszMsgBuffer In/Out:Out 类型:字符指针 可空:N 意思:输出打好包的缓冲区 - 参数.四:pInt_MsgLen + 参数.二:pInt_MsgLen In/Out:Out 类型:整数型指针 可空:N 意思:输出缓冲区大小 - 参数.五:nNetType - In/Out:Out - 类型:整数型 + 参数.三:pSt_MQNumber + In/Out:In + 类型:数据结构指针 可空:N - 意思:输入网络类型 + 意思:输入要打包的序列号信息 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ProtocolModule_Packet_MQNumber(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_MQNUMBER* pSt_MQNumber, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nNetType); +extern "C" bool ProtocolModule_Packet_MQNumber(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_MQNUMBER* pSt_MQNumber); /******************************************************************** 函数名称:ProtocolModule_Packet_PassAuth 函数功能:HTTP代理打包函数 @@ -531,4 +521,62 @@ extern "C" bool ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int nMsgLen, in 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_XMQ* pSt_XMQProtocol); \ No newline at end of file +extern "C" bool ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_XMQ* pSt_XMQProtocol); +/******************************************************************** +函数名称:ProtocolModule_Parse_MessageQueue +函数功能:解析消息数据协议 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:pSt_MQMessage + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出解析的消息协议 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ProtocolModule_Parse_MessageQueue(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_DBMESSAGEQUEUE* pSt_MQMessage); +/******************************************************************** +函数名称:ProtocolModule_Parse_ModifyTopic +函数功能:解析修改主题协议 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:ptszSrcTopic + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出原始主题名称 + 参数.四:ptszDstTopic + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出目标主题名称 + 参数.五:ptszUser + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出所属用户 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ProtocolModule_Parse_ModifyTopic(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszSrcTopic, XCHAR* ptszDstTopic, XCHAR* ptszUser); \ No newline at end of file diff --git a/XEngine_Source/MQCore_ProtocolModule/pch.cpp b/XEngine_Source/MQCore_ProtocolModule/pch.cpp index 7f57a42..a3b6579 100644 --- a/XEngine_Source/MQCore_ProtocolModule/pch.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/pch.cpp @@ -35,9 +35,9 @@ extern "C" bool ProtocolModule_Packet_Common(int nNetType, XENGINE_PROTOCOLHDR * { return m_ProtocolPacket.ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, pSt_MQProtocol, ptszMsgBuffer, pInt_MsgLen, lpszMsgBuffer, nMsgLen); } -extern "C" bool ProtocolModule_Packet_MQNumber(XENGINE_PROTOCOLHDR * pSt_ProtocolHdr, XENGINE_MQNUMBER * pSt_MQNumber, XCHAR * ptszMsgBuffer, int* pInt_MsgLen, int nNetType) +extern "C" bool ProtocolModule_Packet_MQNumber(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_MQNUMBER* pSt_MQNumber) { - return m_ProtocolPacket.ProtocolModule_Packet_MQNumber(pSt_ProtocolHdr, pSt_MQNumber, ptszMsgBuffer, pInt_MsgLen, nNetType); + return m_ProtocolPacket.ProtocolModule_Packet_MQNumber(ptszMsgBuffer, pInt_MsgLen, pSt_MQNumber); } extern "C" bool ProtocolModule_Packet_PassAuth(XENGINE_PROTOCOL_USERAUTH * pSt_ProtocolAuth, XCHAR * ptszMsgBuffer, int* pInt_MsgLen, int nCode) { @@ -105,4 +105,12 @@ extern "C" bool ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int nMsgLen, in extern "C" bool ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_XMQ* pSt_XMQProtocol) { return m_ProtocolParse.ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, pSt_XMQProtocol); +} +extern "C" bool ProtocolModule_Parse_MessageQueue(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_DBMESSAGEQUEUE* pSt_MQMessage) +{ + return m_ProtocolParse.ProtocolModule_Parse_MessageQueue(lpszMsgBuffer, nMsgLen, pSt_MQMessage); +} +extern "C" bool ProtocolModule_Parse_ModifyTopic(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszSrcTopic, XCHAR* ptszDstTopic, XCHAR* ptszUser) +{ + return m_ProtocolParse.ProtocolModule_Parse_ModifyTopic(lpszMsgBuffer, nMsgLen, ptszSrcTopic, ptszDstTopic, ptszUser); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 50f39ed..b0f69dc 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -20,10 +20,15 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP LPCXSTR lpszAPIGetTopic = _X("gettopic"); LPCXSTR lpszAPIGetList = _X("getlist"); LPCXSTR lpszAPIGetOnline = _X("getonline"); + LPCXSTR lpszAPIGetNumber = _X("getnumber"); //请求消息队列编号信息 + LPCXSTR lpszAPICreateTopic = _X("createtopic"); LPCXSTR lpszAPIDelTopic = _X("deletetopic"); LPCXSTR lpszAPIDelUser = _X("deleteuser"); LPCXSTR lpszAPIDelMsg = _X("deletemsg"); + LPCXSTR lpszAPIModifyMsg = _X("modifymsg"); + LPCXSTR lpszAPIModifyTopic = _X("modifytopic"); + //判断请求 if (0 == _tcsxncmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister))) { @@ -111,6 +116,38 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP BaseLib_Memory_Free((XPPPMEM)&pptszListAddr, nListCount); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); } + else if (0 == _tcsxncmp(lpszAPIGetNumber, lpszFuncName, _tcsxlen(lpszAPIGetNumber))) + { + //获取消息队列编号 http://127.0.0.1:5202/api?function=getnumber + XENGINE_DBMESSAGEQUEUE st_DBStart = {}; + XENGINE_DBMESSAGEQUEUE st_DBEnd = {}; + XENGINE_MQNUMBER st_MQNumber = {}; + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("request json parse failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求的获取消息队列编号失败,数据不正确:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + if (!DBModule_MQData_GetSerial(st_MQProtocol.tszMQKey, &st_MQNumber.nCount, &st_DBStart, &st_DBEnd)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, _X("not found topic message")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,获取消息队列序列属性失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nKeepTime == 1 ? "顺序" : "倒序", st_MQProtocol.nSerial, DBModule_GetLastError()); + return false; + } + + st_MQNumber.nFirstNumber = st_DBStart.nQueueSerial; + st_MQNumber.nLastNumber = st_DBEnd.nQueueSerial; + _tcsxcpy(st_MQNumber.tszMQKey, st_MQProtocol.tszMQKey); + ProtocolModule_Packet_MQNumber(tszSDBuffer, &nSDLen, &st_MQNumber); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,获取主题序列编号成功,主题名称:%s,队列个数:%lld,开始编号:%lld,结尾编号:%lld"), lpszClientAddr, st_MQNumber.tszMQKey, st_MQNumber.nCount, st_MQNumber.nFirstNumber, st_MQNumber.nLastNumber); + + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + } else if (0 == _tcsxncmp(lpszAPIGetTopic, lpszFuncName, _tcsxlen(lpszAPIGetTopic))) { //主题 http://127.0.0.1:5202/api?function=gettopic @@ -305,6 +342,70 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求用户删除成功,用户名:%s"), lpszClientAddr, st_UserInfo.tszUserName); } + else if (0 == _tcsxncmp(lpszAPIModifyMsg, lpszFuncName, _tcsxlen(lpszAPIModifyMsg))) + { + XENGINE_DBMESSAGEQUEUE st_DBQueue = {}; + + if (!ProtocolModule_Parse_MessageQueue(lpszMsgBuffer, nMsgLen, &st_DBQueue)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求修改消息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + if (!DBModule_MQData_Modify(&st_DBQueue)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("modify message failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,修改消息:%s,序列号:%lld,失败,错误:%lX"), lpszClientAddr, st_DBQueue.tszQueueName, st_DBQueue.nQueueSerial, DBModule_GetLastError()); + return false; + } + + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求修改消息成功,消息名:%s,序列号:%d"), lpszClientAddr, st_DBQueue.tszQueueName, st_DBQueue.nQueueSerial); + } + else if (0 == _tcsxncmp(lpszAPIModifyTopic, lpszFuncName, _tcsxlen(lpszAPIModifyTopic))) + { + XCHAR tszSrcTopic[XPATH_MIN] = {}; + XCHAR tszDstTopic[XPATH_MIN] = {}; + XCHAR tszUserName[XPATH_MIN] = {}; + + if (!ProtocolModule_Parse_ModifyTopic(lpszMsgBuffer, nMsgLen, tszSrcTopic, tszDstTopic, tszUserName)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求修改主题失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + XENGINE_DBTOPICOWNER st_DBOwner = {}; + //验证所有者 + _tcsxcpy(st_DBOwner.tszUserName, tszUserName); + _tcsxcpy(st_DBOwner.tszQueueName, tszSrcTopic); + + if (!DBModule_MQUser_OwnerQuery(&st_DBOwner)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("query topic owner failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,修改主题失败,可能用户不拥有主题,主题名称:%s,无法继续,错误:%lX"), lpszClientAddr, tszSrcTopic, DBModule_GetLastError()); + return false; + } + //修改主题 + if (!DBModule_MQData_ModifyTable(tszSrcTopic, tszDstTopic)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("modify topic failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,修改主题名称失败,原名称:%s,目标名:%s,错误:%lX"), lpszClientAddr, tszSrcTopic, tszDstTopic, DBModule_GetLastError()); + return false; + } + DBModule_MQUser_KeyTopicUPDate(tszSrcTopic, tszDstTopic); + DBModule_MQUser_TimeTopicUPDate(tszSrcTopic, tszDstTopic); + DBModule_MQUser_OwnerTopicUPDate(tszSrcTopic, tszDstTopic); + + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,修改主题名称成功,原名称:%s,目标名:%s"), lpszClientAddr, tszSrcTopic, tszDstTopic); + } else { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp index 2897c9d..6ed0f03 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp @@ -640,130 +640,6 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,解除消息绑定成功,主题名称:%s"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey); } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQNUMBER == pSt_ProtocolHdr->unOperatorCode) - { - XENGINE_DBMESSAGEQUEUE st_DBStart; - XENGINE_DBMESSAGEQUEUE st_DBEnd; - XENGINE_MQNUMBER st_MQNumber; - - memset(&st_DBStart, '\0', sizeof(XENGINE_DBMESSAGEQUEUE)); - memset(&st_DBEnd, '\0', sizeof(XENGINE_DBMESSAGEQUEUE)); - memset(&st_MQNumber, '\0', sizeof(XENGINE_MQNUMBER)); - if (!DBModule_MQData_GetSerial(st_MQProtocol.tszMQKey, &st_MQNumber.nCount, &st_DBStart, &st_DBEnd)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_SERIAL; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,获取消息队列序列属性失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nKeepTime == 1 ? "顺序" : "倒序", st_MQProtocol.nSerial, DBModule_GetLastError()); - return false; - } - pSt_ProtocolHdr->wReserve = 0; - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPNUMBER; - - st_MQNumber.nFirstNumber = st_DBStart.nQueueSerial; - st_MQNumber.nLastNumber = st_DBEnd.nQueueSerial; - _tcsxcpy(st_MQNumber.tszMQKey, st_MQProtocol.tszMQKey); - ProtocolModule_Packet_MQNumber(pSt_ProtocolHdr, &st_MQNumber, tszSDBuffer, &nSDLen, nNetType); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,获取主题序列编号成功,主题名称:%s,队列个数:%lld,开始编号:%lld,结尾编号:%lld"), lpszClientType, lpszClientAddr, st_MQNumber.tszMQKey, st_MQNumber.nCount, st_MQNumber.nFirstNumber, st_MQNumber.nLastNumber); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICMODIFY == pSt_ProtocolHdr->unOperatorCode) - { - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICMODIFY; - XENGINE_MQTOPIC st_MQTopic; - memset(&st_MQTopic, '\0', sizeof(XENGINE_MQTOPIC)); - - memcpy(&st_MQTopic, lpszMsgBuffer + sizeof(XENGINE_PROTOCOL_XMQ), sizeof(XENGINE_MQTOPIC)); - //验证所有者 - XENGINE_DBTOPICOWNER st_DBOwner; - memset(&st_DBOwner, '\0', sizeof(XENGINE_DBTOPICOWNER)); - - _tcsxcpy(st_DBOwner.tszUserName, tszUserName); - _tcsxcpy(st_DBOwner.tszQueueName, st_MQProtocol.tszMQKey); - - if (!DBModule_MQUser_OwnerQuery(&st_DBOwner)) - { - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_QUERYOWNER; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,修改主题失败,可能用户不拥有主题,主题名称:%s,无法继续,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); - return false; - } - //修改主题 - if (!DBModule_MQData_ModifyTable(st_MQProtocol.tszMQKey, st_MQTopic.tszMQKey)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_MODIFYTOPIC; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,修改主题名称失败,原名称:%s,目标名:%s,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQTopic.tszMQKey, DBModule_GetLastError()); - return false; - } - pSt_ProtocolHdr->wReserve = 0; - DBModule_MQUser_KeyTopicUPDate(st_MQProtocol.tszMQKey, st_MQTopic.tszMQKey); - DBModule_MQUser_TimeTopicUPDate(st_MQProtocol.tszMQKey, st_MQTopic.tszMQKey); - DBModule_MQUser_OwnerTopicUPDate(st_MQProtocol.tszMQKey, st_MQTopic.tszMQKey); - - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,修改主题名称成功,原名称:%s,目标名:%s"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQTopic.tszMQKey); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQMODIFY == pSt_ProtocolHdr->unOperatorCode) - { - XENGINE_DBMESSAGEQUEUE st_DBQueue; - memset(&st_DBQueue, '\0', sizeof(XENGINE_DBMESSAGEQUEUE)); - - st_DBQueue.byMsgType = pSt_ProtocolHdr->byVersion; - st_DBQueue.nQueueSerial = st_MQProtocol.nSerial; - st_DBQueue.nMsgLen = nMsgLen - sizeof(XENGINE_PROTOCOL_XMQ); - - _tcsxcpy(st_DBQueue.tszUserName, tszUserName); - _tcsxcpy(st_DBQueue.tszQueueName, st_MQProtocol.tszMQKey); - memcpy(st_DBQueue.tszMsgBuffer, lpszMsgBuffer + sizeof(XENGINE_PROTOCOL_XMQ), st_DBQueue.nMsgLen); - - if (st_MQProtocol.nKeepTime > 0) - { - XENGINE_LIBTIME st_LibTime; - memset(&st_LibTime, '\0', sizeof(XENGINE_LIBTIME)); - - time_t nTimeStart = time(NULL); - time_t nTimeEnd = nTimeStart + st_MQProtocol.nKeepTime; - BaseLib_TimeSpan_CalForTime(nTimeStart, nTimeEnd, &st_LibTime); - _xstprintf(st_DBQueue.tszQueueLeftTime, _X("%04d-%02d-%02d %02d:%02d:%02d"), st_LibTime.wYear, st_LibTime.wMonth, st_LibTime.wDay, st_LibTime.wHour, st_LibTime.wMinute, st_LibTime.wSecond); - } - if (st_MQProtocol.nPubTime > 0) - { - XENGINE_DBTIMERELEASE st_DBTime; - XENGINE_LIBTIME st_LibTime; - - memset(&st_DBTime, '\0', sizeof(XENGINE_DBTIMERELEASE)); - memset(&st_LibTime, '\0', sizeof(XENGINE_LIBTIME)); - - st_DBTime.nIDMsg = st_DBQueue.nQueueSerial; - st_DBTime.nIDTime = st_MQProtocol.nPubTime; - _tcsxcpy(st_DBTime.tszQueueName, st_DBQueue.tszQueueName); - - BaseLib_Time_TTimeToStuTime(st_MQProtocol.nPubTime, &st_LibTime); - BaseLib_Time_TimeToStr(st_DBQueue.tszQueuePublishTime, NULL, true, &st_LibTime); - DBModule_MQUser_TimeInsert(&st_DBTime); - } - if (!DBModule_MQData_Modify(&st_DBQueue)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_MODIFYMSG; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,修改消息:%s,序列号:%lld,失败,错误:%lX"), lpszClientType, lpszClientAddr, st_DBQueue.tszQueueName, st_DBQueue.nQueueSerial, DBModule_GetLastError()); - return false; - } - pSt_ProtocolHdr->wReserve = 0; - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPMODIFY; - - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,修改消息:%s,序列号:%lld,成功"), lpszClientType, lpszClientAddr, st_DBQueue.tszQueueName, st_DBQueue.nQueueSerial); - } else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUNREAD == pSt_ProtocolHdr->unOperatorCode) { int nListCount = 0; diff --git a/XEngine_Source/XQueue_ProtocolHdr.h b/XEngine_Source/XQueue_ProtocolHdr.h index f7ed219..d5e4780 100644 --- a/XEngine_Source/XQueue_ProtocolHdr.h +++ b/XEngine_Source/XQueue_ProtocolHdr.h @@ -24,14 +24,8 @@ #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPPOST 0x7001 //投递包回复 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQGET 0x7002 //获取包请求 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPGET 0x7003 //获取包回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQMODIFY 0x7006 //消息修改请求 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPMODIFY 0x7007 //消息修改回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQNUMBER 0x7008 //请求消息队列编号信息 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPNUMBER 0x7009 //回复 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUNREAD 0x7010 //请求未读消息 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPUNREAD 0x7011 //响应未读消息 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICMODIFY 0x7104 //主题名修改请求 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICMODIFY 0x7105 //主题名修改回复 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND 0x7106 //请求主题绑定操作 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICBIND 0x7107 //回复 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICUNBIND 0x7108 //请求主题解绑操作 @@ -75,6 +69,7 @@ #define ERROR_XENGINE_MESSAGE_HTTP_DELETE 0x210 //本地删除失败 #define ERROR_XENGINE_MESSAGE_HTTP_MISS 0x211 //缺少关键数据 #define ERROR_XENGINE_MESSAGE_HTTP_EXIST 0x212 //数据已存在 +#define ERROR_XENGINE_MESSAGE_HTTP_FAILURE 0x213 //操作失败 /////////////////////////////////////////////////////////////////////////// // 导出的数据结构 /////////////////////////////////////////////////////////////////////////// From 1fe6ec5724c0b5077268030017be9aefaf94ba21 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 10 Feb 2026 14:16:42 +0800 Subject: [PATCH 10/23] fixed:some protocol not reply and parse process failure --- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index b0f69dc..7f7e4aa 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -110,11 +110,18 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP int nListCount = 0; XCHAR** pptszListAddr; - ProtocolModule_Parse_Type(lpszMsgBuffer, nMsgLen, &nType); + if (!ProtocolModule_Parse_Type(lpszMsgBuffer, nMsgLen, &nType)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求获取在线用户失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } SessionModule_Client_GetListAddr(&pptszListAddr, &nListCount, nType); ProtocolModule_Packet_OnlineList(tszSDBuffer, &nSDLen, &pptszListAddr, nListCount); BaseLib_Memory_Free((XPPPMEM)&pptszListAddr, nListCount); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,获取在线列表信息成功,在线用户数:%d"), lpszClientAddr, nListCount); } else if (0 == _tcsxncmp(lpszAPIGetNumber, lpszFuncName, _tcsxlen(lpszAPIGetNumber))) { @@ -145,8 +152,6 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP ProtocolModule_Packet_MQNumber(tszSDBuffer, &nSDLen, &st_MQNumber); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,获取主题序列编号成功,主题名称:%s,队列个数:%lld,开始编号:%lld,结尾编号:%lld"), lpszClientAddr, st_MQNumber.tszMQKey, st_MQNumber.nCount, st_MQNumber.nFirstNumber, st_MQNumber.nLastNumber); - - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); } else if (0 == _tcsxncmp(lpszAPIGetTopic, lpszFuncName, _tcsxlen(lpszAPIGetTopic))) { @@ -154,10 +159,17 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP int nDBCount = 0; XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol); + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求获取主题信息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } DBModule_MQData_GetLeftCount(st_MQProtocol.tszMQKey, 0, &nDBCount); ProtocolModule_Packet_TopicName(tszSDBuffer, &nSDLen, st_MQProtocol.tszMQKey, nDBCount); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,获取主题信息成功,主题名称:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); } else if (0 == _tcsxncmp(lpszAPIGetList, lpszFuncName, _tcsxlen(lpszAPIGetList))) { @@ -233,7 +245,13 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XENGINE_DBTIMERELEASE st_DBInfo = {}; XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol); + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求删除主题失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } _tcsxcpy(st_DBOwner.tszUserName, st_MQProtocol.tszMQUsr); _tcsxcpy(st_DBOwner.tszQueueName, st_MQProtocol.tszMQKey); @@ -270,7 +288,13 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; XENGINE_DBMESSAGEQUEUE st_MessageQueue = {}; - ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol); + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求删除消息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } if (st_MQProtocol.nSerial <= 0) { From b21d0693a017fb33a3b2a9422b4144d0d257c539 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 10 Feb 2026 15:19:58 +0800 Subject: [PATCH 11/23] modify:unread message and bind and unbind protocol to http reply delete:SUBSCRIBE and UNSUBSCRIBE for mqtt protocol --- .../MQCore_ProtocolModule.def | 4 +- .../ProtocolModule_Packet.cpp | 176 ++++-------------- .../ProtocolModule_Packet.h | 5 +- .../MQCore_ProtocolModule/Protocol_Define.h | 68 ++----- XEngine_Source/MQCore_ProtocolModule/pch.cpp | 12 +- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 89 +++++++++ .../MQService_MQTTTask.cpp | 57 ------ .../MQService_TCPTask.cpp | 84 --------- XEngine_Source/XQueue_ProtocolHdr.h | 6 - 9 files changed, 141 insertions(+), 360 deletions(-) diff --git a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def index c11ae9d..c7760b5 100644 --- a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def +++ b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def @@ -13,9 +13,7 @@ EXPORTS ProtocolModule_Packet_TopicList ProtocolModule_Packet_OnlineList ProtocolModule_Packet_TopicName - ProtocolModule_Packet_UNReadCreate - ProtocolModule_Packet_UNReadInsert - ProtocolModule_Packet_UNReadDelete + ProtocolModule_Packet_UNReadMsg ProtocolModule_Parse_Websocket ProtocolModule_Parse_Register diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp index 04a4a62..e30ca10 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp @@ -576,159 +576,66 @@ bool CProtocolModule_Packet::ProtocolModule_Packet_TopicName(XCHAR* ptszMsgBuffe return true; } /******************************************************************** -函数名称:ProtocolModule_Packet_UNReadCreate -函数功能:未读消息打包创建函数 - 参数.一:pSt_ProtocolHdr - In/Out:In - 类型:数据结构指针 - 可空:N - 意思:输入要打包的协议头 - 参数.二:enPayType - In/Out:In - 类型:枚举型 +函数名称:ProtocolModule_Packet_UNReadMsg +函数功能:获取未读消息打包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 可空:N - 意思:输入打包的负载类型 -返回值 - 类型:逻辑型 - 意思:是否成功 -备注: -*********************************************************************/ -XHANDLE CProtocolModule_Packet::ProtocolModule_Packet_UNReadCreate(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE enPayType) -{ - Protocol_IsErrorOccur = false; - - if (NULL == pSt_ProtocolHdr) - { - Protocol_IsErrorOccur = true; - Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARAMENT; - return NULL; - } - //申请内存 - PROTOCOL_PACKETUNREAD* pSt_UNRead = new PROTOCOL_PACKETUNREAD; - if (NULL == pSt_UNRead) - { - Protocol_IsErrorOccur = true; - Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_MALLOC; - return NULL; - } - memset(&pSt_UNRead->st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - - pSt_UNRead->nType = enPayType; - if (pSt_UNRead->nType == ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_BIN) - { - pSt_UNRead->st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - pSt_UNRead->st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - pSt_UNRead->st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - pSt_UNRead->st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPUNREAD; - pSt_UNRead->st_ProtocolHdr.byVersion = ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_JSON; - } - else - { - pSt_UNRead->st_JsonRoot["wHeader"] = pSt_ProtocolHdr->wHeader; - pSt_UNRead->st_JsonRoot["wTail"] = pSt_ProtocolHdr->wTail; - pSt_UNRead->st_JsonRoot["unOperatorType"] = pSt_ProtocolHdr->unOperatorType; - pSt_UNRead->st_JsonRoot["unOperatorCode"] = pSt_ProtocolHdr->unOperatorCode; - pSt_UNRead->st_JsonRoot["byVersion"] = ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_JSON; - pSt_UNRead->st_JsonRoot["wReserve"] = 0; - } - return pSt_UNRead; -} -/******************************************************************** -函数名称:ProtocolModule_Packet_UNReadInsert -函数功能:消息打包数据插入 - 参数.一:xhToken - In/Out:In - 类型:句柄 + 意思:输出打包的内容 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 可空:N - 意思:输入要操作的句柄 - 参数.二:lpszKeyName + 意思:输出打包大小 + 参数.三:pppSt_UserKey In/Out:In 类型:三级指针 可空:N - 意思:输入队列名称 - 参数.三:nListCount + 意思:输入要打包的数据 + 参数.四:nListCount In/Out:In 类型:整数型 可空:N - 意思:输入队列个数 -返回值 - 类型:逻辑型 - 意思:是否成功 -备注: -*********************************************************************/ -bool CProtocolModule_Packet::ProtocolModule_Packet_UNReadInsert(XHANDLE xhToken, LPCXSTR lpszKeyName, int nListCount) -{ - Protocol_IsErrorOccur = false; - - PROTOCOL_PACKETUNREAD* pSt_UNRead = (PROTOCOL_PACKETUNREAD*)xhToken; - if (NULL == pSt_UNRead) - { - Protocol_IsErrorOccur = true; - Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_NOTFOUND; - return false; - } - Json::Value st_JsonSubArray; - - st_JsonSubArray["Name"] = lpszKeyName; - st_JsonSubArray["Count"] = nListCount; - pSt_UNRead->st_JsonArray.append(st_JsonSubArray); - return true; -} -/******************************************************************** -函数名称:ProtocolModule_Packet_UNReadDelete -函数功能:删除数据并且导出 - 参数.一:xhToken - In/Out:In - 类型:句柄 - 可空:N - 意思:输入要操作的句柄 - 参数.二:ptszMsgBuffer - In/Out:Out - 类型:字符指针 - 可空:N - 意思:输出打好包的数据 - 参数.三:pInt_MsgLen - In/Out:Out - 类型:整数型指针 - 可空:N - 意思:输出数据大小 + 意思:输入要打包的数据的个数 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -bool CProtocolModule_Packet::ProtocolModule_Packet_UNReadDelete(XHANDLE xhToken, XCHAR* ptszMsgBuffer, int* pInt_MsgLen) +bool CProtocolModule_Packet::ProtocolModule_Packet_UNReadMsg(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_DBUSERKEY*** pppSt_UserKey, int nListCount) { Protocol_IsErrorOccur = false; - PROTOCOL_PACKETUNREAD* pSt_UNRead = (PROTOCOL_PACKETUNREAD*)xhToken; - if (NULL == pSt_UNRead) + if (NULL == ptszMsgBuffer || NULL == pInt_MsgLen) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_NOTFOUND; return false; } + Json::Value st_JsonRoot; + Json::Value st_JsonArray; Json::StreamWriterBuilder st_JsonBuilder; - st_JsonBuilder["emitUTF8"] = true; - pSt_UNRead->st_JsonRoot["Array"] = pSt_UNRead->st_JsonArray; - pSt_UNRead->st_JsonRoot["Count"] = pSt_UNRead->st_JsonArray.size(); + st_JsonRoot["code"] = 0; + st_JsonRoot["msg"] = "success"; - if (pSt_UNRead->nType == ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_BIN) - { - pSt_UNRead->st_ProtocolHdr.unPacketSize = Json::writeString(st_JsonBuilder, pSt_UNRead->st_JsonRoot).length(); - memcpy(ptszMsgBuffer, &pSt_UNRead->st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(ptszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), Json::writeString(st_JsonBuilder, pSt_UNRead->st_JsonRoot).c_str(), pSt_UNRead->st_ProtocolHdr.unPacketSize); - *pInt_MsgLen = sizeof(XENGINE_PROTOCOLHDR) + pSt_UNRead->st_ProtocolHdr.unPacketSize; - } - else + for (int i = 0; i < nListCount; i++) { - *pInt_MsgLen = Json::writeString(st_JsonBuilder, pSt_UNRead->st_JsonRoot).length(); - memcpy(ptszMsgBuffer, Json::writeString(st_JsonBuilder, pSt_UNRead->st_JsonRoot).c_str(), *pInt_MsgLen); + Json::Value st_JsonObject; + st_JsonObject["tszUserName"] = (*pppSt_UserKey)[i]->tszUserName; + st_JsonObject["nKeySerial"] = (*pppSt_UserKey)[i]->nKeySerial; + st_JsonObject["tszCreateTime"] = (*pppSt_UserKey)[i]->tszCreateTime; + st_JsonObject["tszKeyName"] = (*pppSt_UserKey)[i]->tszKeyName; + st_JsonObject["tszUPTime"] = (*pppSt_UserKey)[i]->tszUPTime; + st_JsonArray.append(st_JsonObject); } + st_JsonRoot["Array"] = st_JsonArray; + st_JsonRoot["Count"] = nListCount; - delete pSt_UNRead; - pSt_UNRead = NULL; + 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; } /////////////////////////////////////////////////////////////////////////////// @@ -965,23 +872,6 @@ bool CProtocolModule_Packet::ProtocolModule_Packet_MQTTCommon(XENGINE_PROTOCOLHD } } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICBIND == pSt_ProtocolHdr->unOperatorCode) - { - if (0 == pSt_ProtocolHdr->wReserve) - { - MQTTProtocol_Packet_REPComm(tszRVBuffer, &nRVLen, pSt_ProtocolHdr->wPacketSerial, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_REASON_SUCCESS); - } - else - { - MQTTProtocol_Packet_REPComm(tszRVBuffer, &nRVLen, pSt_ProtocolHdr->wPacketSerial, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_REASON_TOPICNAME); - } - MQTTProtocol_Packet_Header(ptszMsgBuffer, pInt_MsgLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_SUBACK, tszRVBuffer, nRVLen); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICUNBIND == pSt_ProtocolHdr->unOperatorCode) - { - MQTTProtocol_Packet_REPComm(tszRVBuffer, &nRVLen, pSt_ProtocolHdr->wPacketSerial, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_REASON_SUCCESS); - MQTTProtocol_Packet_Header(ptszMsgBuffer, pInt_MsgLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_UNSUBACK, tszRVBuffer, nRVLen); - } else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_MSGNOTIFY == pSt_ProtocolHdr->unOperatorCode) { MQTTProtocol_Packet_REQPublish(tszRVBuffer, &nRVLen, pSt_MQProtocol->tszMQKey, lpszMsgBuffer, nMsgLen); diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h index 8c332db..db0b550 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h @@ -35,10 +35,7 @@ class CProtocolModule_Packet bool ProtocolModule_Packet_TopicList(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** pppszTableName, int nListCount); bool ProtocolModule_Packet_OnlineList(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListUser, int nListCount); bool ProtocolModule_Packet_TopicName(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszTopicName, int nTopicCount); -public: - XHANDLE ProtocolModule_Packet_UNReadCreate(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE enPayType); - bool ProtocolModule_Packet_UNReadInsert(XHANDLE xhToken, LPCXSTR lpszKeyName, int nListCount); - bool ProtocolModule_Packet_UNReadDelete(XHANDLE xhToken, XCHAR* ptszMsgBuffer, int* pInt_MsgLen); + bool ProtocolModule_Packet_UNReadMsg(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_DBUSERKEY*** pppSt_UserKey, int nListCount); protected: bool ProtocolModule_Packet_TCPCommon(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_PROTOCOL_XMQ* pSt_MQProtocol, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszMsgBuffer = NULL, int nMsgLen = 0); bool ProtocolModule_Packet_WSCommon(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_PROTOCOL_XMQ* pSt_MQProtocol, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszMsgBuffer = NULL, int nMsgLen = 0); diff --git a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h index 8450082..c9a5d3c 100644 --- a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h +++ b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h @@ -323,72 +323,34 @@ extern "C" bool ProtocolModule_Packet_OnlineList(XCHAR* ptszMsgBuffer, int* pInt *********************************************************************/ extern "C" bool ProtocolModule_Packet_TopicName(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszTopicName, int nTopicCount); /******************************************************************** -函数名称:ProtocolModule_Packet_UNReadCreate -函数功能:未读消息打包创建函数 - 参数.一:pSt_ProtocolHdr - In/Out:In - 类型:数据结构指针 - 可空:N - 意思:输入要打包的协议头 - 参数.二:enPayType - In/Out:In - 类型:枚举型 +函数名称:ProtocolModule_Packet_UNReadMsg +函数功能:获取未读消息打包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 可空:N - 意思:输入打包的负载类型 -返回值 - 类型:逻辑型 - 意思:是否成功 -备注: -*********************************************************************/ -extern "C" XHANDLE ProtocolModule_Packet_UNReadCreate(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE enPayType); -/******************************************************************** -函数名称:ProtocolModule_Packet_UNReadInsert -函数功能:消息打包数据插入 - 参数.一:xhToken - In/Out:In - 类型:句柄 + 意思:输出打包的内容 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 可空:N - 意思:输入要操作的句柄 - 参数.二:lpszKeyName + 意思:输出打包大小 + 参数.三:pppSt_UserKey In/Out:In 类型:三级指针 可空:N - 意思:输入队列名称 - 参数.三:nListCount + 意思:输入要打包的数据 + 参数.四:nListCount In/Out:In 类型:整数型 可空:N - 意思:输入队列个数 -返回值 - 类型:逻辑型 - 意思:是否成功 -备注: -*********************************************************************/ -extern "C" bool ProtocolModule_Packet_UNReadInsert(XHANDLE xhToken, LPCXSTR lpszKeyName, int nListCount); -/******************************************************************** -函数名称:ProtocolModule_Packet_UNReadDelete -函数功能:删除数据并且导出 - 参数.一:xhToken - In/Out:In - 类型:句柄 - 可空:N - 意思:输入要操作的句柄 - 参数.二:ptszMsgBuffer - In/Out:Out - 类型:字符指针 - 可空:N - 意思:输出打好包的数据 - 参数.三:pInt_MsgLen - In/Out:Out - 类型:整数型指针 - 可空:N - 意思:输出数据大小 + 意思:输入要打包的数据的个数 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ProtocolModule_Packet_UNReadDelete(XHANDLE xhToken, XCHAR* ptszMsgBuffer, int* pInt_MsgLen); +extern "C" bool ProtocolModule_Packet_UNReadMsg(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_DBUSERKEY*** pppSt_UserKey, int nListCount); /************************************************************************/ /* 解析类函数 */ /************************************************************************/ diff --git a/XEngine_Source/MQCore_ProtocolModule/pch.cpp b/XEngine_Source/MQCore_ProtocolModule/pch.cpp index a3b6579..8564ca2 100644 --- a/XEngine_Source/MQCore_ProtocolModule/pch.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/pch.cpp @@ -71,17 +71,9 @@ extern "C" bool ProtocolModule_Packet_TopicName(XCHAR * ptszMsgBuffer, int* pInt { return m_ProtocolPacket.ProtocolModule_Packet_TopicName(ptszMsgBuffer, pInt_MsgLen, lpszTopicName, nTopicCount); } -extern "C" XHANDLE ProtocolModule_Packet_UNReadCreate(XENGINE_PROTOCOLHDR * pSt_ProtocolHdr, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE enPayType) +extern "C" bool ProtocolModule_Packet_UNReadMsg(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_DBUSERKEY*** pppSt_UserKey, int nListCount) { - return m_ProtocolPacket.ProtocolModule_Packet_UNReadCreate(pSt_ProtocolHdr, enPayType); -} -extern "C" bool ProtocolModule_Packet_UNReadInsert(XHANDLE xhToken, LPCXSTR lpszKeyName, int nListCount) -{ - return m_ProtocolPacket.ProtocolModule_Packet_UNReadInsert(xhToken, lpszKeyName, nListCount); -} -extern "C" bool ProtocolModule_Packet_UNReadDelete(XHANDLE xhToken, XCHAR * ptszMsgBuffer, int* pInt_MsgLen) -{ - return m_ProtocolPacket.ProtocolModule_Packet_UNReadDelete(xhToken, ptszMsgBuffer, pInt_MsgLen); + return m_ProtocolPacket.ProtocolModule_Packet_UNReadMsg(ptszMsgBuffer, pInt_MsgLen, pppSt_UserKey, nListCount); } /************************************************************************/ /* 解析类函数 */ diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 7f7e4aa..9569c38 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -29,6 +29,9 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP LPCXSTR lpszAPIModifyMsg = _X("modifymsg"); LPCXSTR lpszAPIModifyTopic = _X("modifytopic"); + LPCXSTR lpszAPIBindMsg = _X("bindmsg"); + LPCXSTR lpszAPIUMBindMsg = _X("unbindmsg"); + LPCXSTR lpszAPIUNReadMsg = _X("unreadmsg"); //判断请求 if (0 == _tcsxncmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister))) { @@ -430,6 +433,92 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,修改主题名称成功,原名称:%s,目标名:%s"), lpszClientAddr, tszSrcTopic, tszDstTopic); } + else if (0 == _tcsxncmp(lpszAPIBindMsg, lpszFuncName, _tcsxlen(lpszAPIBindMsg))) + { + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求绑定主题失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + XENGINE_DBUSERKEY st_Userkey = {}; + + _tcsxcpy(st_Userkey.tszUserName, st_MQProtocol.tszMQUsr); + _tcsxcpy(st_Userkey.tszKeyName, st_MQProtocol.tszMQKey); + //先查询有没有 + if (DBModule_MQUser_KeyQuery(&st_Userkey)) + { + //有就更新 + st_Userkey.nKeySerial = st_MQProtocol.nSerial; + if (!DBModule_MQUser_KeyUPDate(&st_Userkey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("update bind topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,设置消息队列主题更新失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); + return false; + } + } + else + { + //没有就创建 + st_Userkey.nKeySerial = st_MQProtocol.nSerial; + if (!DBModule_MQUser_KeyInsert(&st_Userkey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("insert bind topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,设置消息队列主题创建失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); + return false; + } + } + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,请求设置序列号成功,主题名称:%s,序列号:%lld"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial); + } + else if (0 == _tcsxncmp(lpszAPIUMBindMsg, lpszFuncName, _tcsxlen(lpszAPIUMBindMsg))) + { + XENGINE_DBUSERKEY st_Userkey = {}; + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求解绑主题失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + _tcsxcpy(st_Userkey.tszUserName, st_MQProtocol.tszMQUsr); + _tcsxcpy(st_Userkey.tszKeyName, st_MQProtocol.tszMQKey); + + if (!DBModule_MQUser_KeyDelete(&st_Userkey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("unbind topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,解除消息绑定订阅失败,可能没有找到主题用户,主题名称:%s,用户名称:%s,错误:%lX"),lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.tszMQUsr, DBModule_GetLastError()); + return false; + } + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,解除消息绑定成功,主题名称:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); + } + else if (0 == _tcsxncmp(lpszAPIUMBindMsg, lpszFuncName, _tcsxlen(lpszAPIUMBindMsg))) + { + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求未读消息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + int nListCount = 0; + XENGINE_DBUSERKEY** ppSt_UserKey; + DBModule_MQUser_KeyList(st_MQProtocol.tszMQUsr, _X(""), &ppSt_UserKey, &nListCount); + ProtocolModule_Packet_UNReadMsg(tszSDBuffer, &nSDLen, &ppSt_UserKey, nListCount); + BaseLib_Memory_Free((XPPPMEM)&ppSt_UserKey, nListCount); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,请求未读消息成功,用户名:%s,发送未读消息成功,发送的主题个数:%d"), lpszClientAddr, st_MQProtocol.tszMQUsr, nListCount); + } else { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp index 42ce395..265fa58 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp @@ -109,63 +109,6 @@ bool MQService_MQTT_Handle(LPCXSTR lpszClientAddr, MQTTPROTOCOL_FIXEDHEADER* pSt MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_ProtocolAuth, sizeof(XENGINE_PROTOCOL_USERAUTH), XENGINE_MQAPP_NETTYPE_MQTT); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求链接成功,客户端ID:%s,用户名:%s"), lpszClientAddr, st_USerInfo.tszClientID, st_USerInfo.tszClientUser); } - else if (XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_SUBSCRIBE == pSt_MQTTHdr->byMsgType) - { - XSHOT wMsgID = 0; - XCHAR tszTopicName[XPATH_MAX] = {}; - int nListCount = 0; - MQTTPROTOCOL_HDRPROPERTY** ppSt_HDRProperty; - MQTTPROTOCOL_HDRSUBSCRIBE st_SubScribe = {}; - - if (!MQTTProtocol_Parse_Subscribe(lpszMSGBuffer, nMSGLen, &wMsgID, tszTopicName, &st_SubScribe, &ppSt_HDRProperty, &nListCount)) - { - MQTTProtocol_Packet_DisConnect(tszRVBuffer, &nRVLen); - MQTTProtocol_Packet_Header(tszSDBuffer, &nSDLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_DISCONN, tszRVBuffer, nRVLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_MQTT); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求订阅失败,错误码:%lX"), lpszClientAddr, MQTTProtocol_GetLastError()); - return false; - } - XENGINE_PROTOCOLHDR st_ProtocolHdr = {}; - XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND; - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - st_ProtocolHdr.wPacketSerial = wMsgID; - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - _tcsxcpy(st_MQProtocol.tszMQKey, tszTopicName); - MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_MQProtocol, sizeof(XENGINE_PROTOCOL_XMQ), XENGINE_MQAPP_NETTYPE_MQTT); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求订阅成功,主题名称:%s"), lpszClientAddr, tszTopicName); - } - else if (XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_UNSUBSCRIBE == pSt_MQTTHdr->byMsgType) - { - XSHOT wMsgID = 0; - XCHAR tszTopicName[XPATH_MAX] = {}; - int nListCount = 0; - MQTTPROTOCOL_HDRPROPERTY** ppSt_HDRProperty; - - if (!MQTTProtocol_Parse_UNSubcribe(lpszMSGBuffer, nMSGLen, &wMsgID, tszTopicName, &ppSt_HDRProperty, &nListCount)) - { - MQTTProtocol_Packet_DisConnect(tszRVBuffer, &nRVLen); - MQTTProtocol_Packet_Header(tszSDBuffer, &nSDLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_DISCONN, tszRVBuffer, nRVLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_MQTT); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求取消订阅失败,错误码:%lX"), lpszClientAddr, MQTTProtocol_GetLastError()); - return false; - } - XENGINE_PROTOCOLHDR st_ProtocolHdr = {}; - XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICUNBIND; - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - st_ProtocolHdr.wPacketSerial = wMsgID; - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - _tcsxcpy(st_MQProtocol.tszMQKey, tszTopicName); - MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_MQProtocol, sizeof(XENGINE_PROTOCOL_XMQ), XENGINE_MQAPP_NETTYPE_MQTT); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求取消订阅,主题名称:%s"), lpszClientAddr, tszTopicName); - } else if (XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_PUBLISH == pSt_MQTTHdr->byMsgType) { int nListCount = 0; diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp index 6ed0f03..6a4e228 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp @@ -576,90 +576,6 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,主题:%s,序列:%lld,获取消息数据成功,消息大小:%d"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MessageQueue.nQueueSerial, st_MessageQueue.nMsgLen); } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND == pSt_ProtocolHdr->unOperatorCode) - { - pSt_ProtocolHdr->wReserve = 0; - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICBIND; - - XENGINE_DBUSERKEY st_Userkey; - memset(&st_Userkey, '\0', sizeof(XENGINE_DBUSERKEY)); - - _tcsxcpy(st_Userkey.tszUserName, tszUserName); - _tcsxcpy(st_Userkey.tszKeyName, st_MQProtocol.tszMQKey); - //先查询有没有 - if (DBModule_MQUser_KeyQuery(&st_Userkey)) - { - //有就更新 - st_Userkey.nKeySerial = st_MQProtocol.nSerial; - if (!DBModule_MQUser_KeyUPDate(&st_Userkey)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_KEYUP; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,设置消息队列主题更新失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); - return false; - } - } - else - { - //没有就创建 - st_Userkey.nKeySerial = st_MQProtocol.nSerial; - if (!DBModule_MQUser_KeyInsert(&st_Userkey)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_BINDKEY; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,设置消息队列主题创建失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); - return false; - } - } - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,请求设置序列号成功,主题名称:%s,序列号:%lld"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICUNBIND == pSt_ProtocolHdr->unOperatorCode) - { - pSt_ProtocolHdr->wReserve = 0; - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICUNBIND; - - XENGINE_DBUSERKEY st_Userkey; - memset(&st_Userkey, '\0', sizeof(XENGINE_DBUSERKEY)); - - _tcsxcpy(st_Userkey.tszUserName, tszUserName); - _tcsxcpy(st_Userkey.tszKeyName, st_MQProtocol.tszMQKey); - - if (!DBModule_MQUser_KeyDelete(&st_Userkey)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_DELKEY; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,解除消息绑定订阅失败,可能没有找到主题用户,主题名称:%s,用户名称:%s,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, tszUserName, DBModule_GetLastError()); - return false; - } - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,解除消息绑定成功,主题名称:%s"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUNREAD == pSt_ProtocolHdr->unOperatorCode) - { - int nListCount = 0; - XENGINE_DBUSERKEY** ppSt_UserKey; - DBModule_MQUser_KeyList(tszUserName, _X(""), &ppSt_UserKey, &nListCount); - - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPUNREAD; - XHANDLE xhUNRead = ProtocolModule_Packet_UNReadCreate(pSt_ProtocolHdr, XENGINE_MQAPP_NETTYPE_TCP == nNetType ? ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_BIN : ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_JSON); - //查找具体主题列表 - for (int i = 0; i < nListCount; i++) - { - int nDBCount = 0; - DBModule_MQData_GetLeftCount(ppSt_UserKey[i]->tszKeyName, ppSt_UserKey[i]->nKeySerial, &nDBCount); - ProtocolModule_Packet_UNReadInsert(xhUNRead, ppSt_UserKey[i]->tszKeyName, nDBCount); - } - ProtocolModule_Packet_UNReadDelete(xhUNRead, tszSDBuffer, &nSDLen); - BaseLib_Memory_Free((XPPPMEM)&ppSt_UserKey, nListCount); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,请求未读消息成功,用户名:%s,发送未读消息成功,发送的主题个数:%d"), lpszClientType, lpszClientAddr, tszUserName, nListCount); - } else { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("%s消息端:%s,子协议错误,子协议:%x"), lpszClientType, lpszClientAddr, pSt_ProtocolHdr->unOperatorCode); diff --git a/XEngine_Source/XQueue_ProtocolHdr.h b/XEngine_Source/XQueue_ProtocolHdr.h index d5e4780..d90f09e 100644 --- a/XEngine_Source/XQueue_ProtocolHdr.h +++ b/XEngine_Source/XQueue_ProtocolHdr.h @@ -24,12 +24,6 @@ #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPPOST 0x7001 //投递包回复 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQGET 0x7002 //获取包请求 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPGET 0x7003 //获取包回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUNREAD 0x7010 //请求未读消息 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPUNREAD 0x7011 //响应未读消息 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND 0x7106 //请求主题绑定操作 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICBIND 0x7107 //回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICUNBIND 0x7108 //请求主题解绑操作 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICUNBIND 0x7109 //回复 //Only TCP and WEBSOCKET #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_MSGNOTIFY 0x70A0 //消息通知 /////////////////////////////////////////////////////////////////////////// From 3d561b0b0e9bc5d05f66088f7509691b036c3991 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 10 Feb 2026 15:26:51 +0800 Subject: [PATCH 12/23] fixed:build error --- .../ProtocolModule_Packet/ProtocolModule_Packet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp index e30ca10..cb82993 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp @@ -624,7 +624,7 @@ bool CProtocolModule_Packet::ProtocolModule_Packet_UNReadMsg(XCHAR* ptszMsgBuffe { Json::Value st_JsonObject; st_JsonObject["tszUserName"] = (*pppSt_UserKey)[i]->tszUserName; - st_JsonObject["nKeySerial"] = (*pppSt_UserKey)[i]->nKeySerial; + st_JsonObject["nKeySerial"] = (Json::Value::Int64)(*pppSt_UserKey)[i]->nKeySerial; st_JsonObject["tszCreateTime"] = (*pppSt_UserKey)[i]->tszCreateTime; st_JsonObject["tszKeyName"] = (*pppSt_UserKey)[i]->tszKeyName; st_JsonObject["tszUPTime"] = (*pppSt_UserKey)[i]->tszUPTime; From 881514a4a171b6c195cac879d468443c704973ef Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 26 Feb 2026 10:27:15 +0800 Subject: [PATCH 13/23] delete:http comm message packet --- .../ProtocolModule_Packet/ProtocolModule_Packet.cpp | 4 ---- XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp | 4 ---- 2 files changed, 8 deletions(-) diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp index cb82993..e8a437a 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp @@ -75,10 +75,6 @@ bool CProtocolModule_Packet::ProtocolModule_Packet_Common(int nNetType, XENGINE_ { ProtocolModule_Packet_WSCommon(pSt_ProtocolHdr, pSt_MQProtocol, ptszMsgBuffer, pInt_MsgLen, lpszMsgBuffer, nMsgLen); } - else if (XENGINE_MQAPP_NETTYPE_HTTP == nNetType) - { - ProtocolModule_Packet_Http(ptszMsgBuffer, pInt_MsgLen, pSt_ProtocolHdr->wReserve); - } else { ProtocolModule_Packet_MQTTCommon(pSt_ProtocolHdr, pSt_MQProtocol, ptszMsgBuffer, pInt_MsgLen, lpszMsgBuffer, nMsgLen); diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp index 6a4e228..6c640f9 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp @@ -53,10 +53,6 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC { lpszClientType = _X("WEBSOCKET"); } - else if (XENGINE_MQAPP_NETTYPE_HTTP == nNetType) - { - lpszClientType = _X("HTTP"); - } else { lpszClientType = _X("MQTT"); From acbd9a63ab113a0fdd16f6cd5073dbc6b8da98f3 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 26 Feb 2026 16:05:24 +0800 Subject: [PATCH 14/23] modify:bind message protocol string fixed:no reply when not found post protocol --- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 9569c38..4f98824 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -29,8 +29,8 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP LPCXSTR lpszAPIModifyMsg = _X("modifymsg"); LPCXSTR lpszAPIModifyTopic = _X("modifytopic"); - LPCXSTR lpszAPIBindMsg = _X("bindmsg"); - LPCXSTR lpszAPIUMBindMsg = _X("unbindmsg"); + LPCXSTR lpszAPIBind = _X("bind"); + LPCXSTR lpszAPIUMBind = _X("unbind"); LPCXSTR lpszAPIUNReadMsg = _X("unreadmsg"); //判断请求 if (0 == _tcsxncmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister))) @@ -433,7 +433,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,修改主题名称成功,原名称:%s,目标名:%s"), lpszClientAddr, tszSrcTopic, tszDstTopic); } - else if (0 == _tcsxncmp(lpszAPIBindMsg, lpszFuncName, _tcsxlen(lpszAPIBindMsg))) + else if (0 == _tcsxncmp(lpszAPIBind, lpszFuncName, _tcsxlen(lpszAPIBind))) { XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) @@ -476,7 +476,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,请求设置序列号成功,主题名称:%s,序列号:%lld"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial); } - else if (0 == _tcsxncmp(lpszAPIUMBindMsg, lpszFuncName, _tcsxlen(lpszAPIUMBindMsg))) + else if (0 == _tcsxncmp(lpszAPIUMBind, lpszFuncName, _tcsxlen(lpszAPIUMBind))) { XENGINE_DBUSERKEY st_Userkey = {}; XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; @@ -501,7 +501,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,解除消息绑定成功,主题名称:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); } - else if (0 == _tcsxncmp(lpszAPIUMBindMsg, lpszFuncName, _tcsxlen(lpszAPIUMBindMsg))) + else if (0 == _tcsxncmp(lpszAPIUNReadMsg, lpszFuncName, _tcsxlen(lpszAPIUNReadMsg))) { XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) @@ -521,6 +521,8 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP } else { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, _X("protocol not support")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); } return true; From 68fc1484aeb461970f92f3c9975b454f01d38aca Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 26 Feb 2026 16:07:40 +0800 Subject: [PATCH 15/23] fixed:http protocol not reply when not found protocol --- .../MQService_HTTPTask/MQService_HTTPGet.cpp | 6 ++++++ .../MQService_HTTPTask/MQService_HTTPPost.cpp | 2 +- XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp index d14df99..aec98db 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp @@ -98,6 +98,12 @@ bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, XCH XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求关闭TOKEN:%s 成功"), lpszClientAddr, tszUserToken); } + else + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, _X("protocol not support")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); + } return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 4f98824..014fa2a 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -523,7 +523,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, _X("protocol not support")); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); } return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp index 4efacdb..980f526 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp @@ -160,7 +160,9 @@ bool MessageQueue_Http_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); + ProtocolModule_Packet_Http(tszPKTBuffer, &nPKTLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, _X("protocol not support")); + XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); } return true; } \ No newline at end of file From 39ef1b7c4ec85d76c84dc4bd613aeda2e9c3d6ab Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 26 Feb 2026 16:11:44 +0800 Subject: [PATCH 16/23] delete:more protocol error define --- XEngine_Source/XQueue_ProtocolHdr.h | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/XEngine_Source/XQueue_ProtocolHdr.h b/XEngine_Source/XQueue_ProtocolHdr.h index d90f09e..a02c113 100644 --- a/XEngine_Source/XQueue_ProtocolHdr.h +++ b/XEngine_Source/XQueue_ProtocolHdr.h @@ -41,16 +41,6 @@ #define ERROR_XENGINE_MESSAGE_XMQ_TIMEOUT 0x105 //消息超时,无权使用 #define ERROR_XENGINE_MESSAGE_XMQ_PUBTIME 0x106 //定时消息,无权使用 #define ERROR_XENGINE_MESSAGE_XMQ_KEYQUERY 0x107 //查询绑定消息失败 -#define ERROR_XENGINE_MESSAGE_XMQ_SERIAL 0x108 //消息序号错误 -#define ERROR_XENGINE_MESSAGE_XMQ_CREATEKEY 0x109 //创建消息KEY失败 -#define ERROR_XENGINE_MESSAGE_XMQ_BINDOWNER 0x110 //绑定所有者失败 -#define ERROR_XENGINE_MESSAGE_XMQ_DELOWNER 0x111 //删除所有者失败 -#define ERROR_XENGINE_MESSAGE_XMQ_KEYUP 0x112 //更新KEY失败 -#define ERROR_XENGINE_MESSAGE_XMQ_BINDKEY 0x113 //绑定KEY失败 -#define ERROR_XENGINE_MESSAGE_XMQ_DELKEY 0x114 //删除KEY失败 -#define ERROR_XENGINE_MESSAGE_XMQ_QUERYOWNER 0x115 //查询所有者失败 -#define ERROR_XENGINE_MESSAGE_XMQ_MODIFYTOPIC 0x116 //修改主题失败 -#define ERROR_XENGINE_MESSAGE_XMQ_MODIFYMSG 0x117 //修改消息失败 #define ERROR_XENGINE_MESSAGE_HTTP_PARAMENT 0x201 //HTTP请求参数错误 #define ERROR_XENGINE_MESSAGE_HTTP_AUTHORIZE 0x202 //验证失败没有权限 From 1f3fa6cb1e1352814386d992c74f12c361639fa5 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 27 Feb 2026 13:48:17 +0800 Subject: [PATCH 17/23] modify:protocol user unified modify:permission management and process --- .../ProtocolModule_Parse.cpp | 4 +- .../MQService_HTTPTask/MQService_HTTPGet.cpp | 2 +- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 355 ++++++++++-------- XEngine_Source/XQueue_ProtocolHdr.h | 1 + 4 files changed, 207 insertions(+), 155 deletions(-) diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp index 5d0c500..48993cb 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp @@ -624,9 +624,9 @@ bool CProtocolModule_Parse::ProtocolModule_Parse_ModifyTopic(LPCXSTR lpszMsgBuff { _tcsxcpy(ptszDstTopic, st_JsonObject["tszDstTopic"].asCString()); } - if (!st_JsonObject["tszUser"].isNull()) + if (!st_JsonObject["tszMQUsr"].isNull()) { - _tcsxcpy(ptszUser, st_JsonObject["tszUser"].asCString()); + _tcsxcpy(ptszUser, st_JsonObject["tszMQUsr"].asCString()); } return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp index aec98db..8694711 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp @@ -47,7 +47,7 @@ bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, XCH return true; } //权限是否正确 - if (0 != st_UserInfo.nUserLevel) + if (ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_BAN == st_UserInfo.nUserLevel) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_AUTHORIZE, "permission error"); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 014fa2a..1a9760d 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -16,22 +16,38 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XNETHANDLE xhToken = 0; XCHAR tszSDBuffer[1024] = {}; LPCXSTR lpszAPIRegister = _X("register"); + LPCXSTR lpszAPIDelUser = _X("deleteuser"); LPCXSTR lpszAPIGetUser = _X("getuser"); LPCXSTR lpszAPIGetTopic = _X("gettopic"); LPCXSTR lpszAPIGetList = _X("getlist"); LPCXSTR lpszAPIGetOnline = _X("getonline"); LPCXSTR lpszAPIGetNumber = _X("getnumber"); //请求消息队列编号信息 + LPCXSTR lpszAPIBind = _X("bind"); + LPCXSTR lpszAPIUMBind = _X("unbind"); + LPCXSTR lpszAPIUNReadMsg = _X("unreadmsg"); LPCXSTR lpszAPICreateTopic = _X("createtopic"); LPCXSTR lpszAPIDelTopic = _X("deletetopic"); - LPCXSTR lpszAPIDelUser = _X("deleteuser"); + LPCXSTR lpszAPIDelMsg = _X("deletemsg"); LPCXSTR lpszAPIModifyMsg = _X("modifymsg"); LPCXSTR lpszAPIModifyTopic = _X("modifytopic"); - LPCXSTR lpszAPIBind = _X("bind"); - LPCXSTR lpszAPIUMBind = _X("unbind"); - LPCXSTR lpszAPIUNReadMsg = _X("unreadmsg"); + if (!ProtocolModule_Parse_Token(lpszMsgBuffer, nMsgLen, &xhToken)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("token value not set")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求POST消息失败,TOKEN没有设置或者协议错误,无法继续"), lpszClientAddr); + return false; + } + XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; + if (!Session_Token_Get(xhToken, &st_UserInfo)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, _X("token not found")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求POST消息失败,TOKEN不存在"), lpszClientAddr); + return false; + } //判断请求 if (0 == _tcsxncmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister))) { @@ -95,6 +111,55 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求用户注册成功,用户名:%s,密码:%s"), lpszClientAddr, st_UserInfo.tszUserName, st_UserInfo.tszUserPass); } + else if (0 == _tcsxncmp(lpszAPIDelUser, lpszFuncName, _tcsxlen(lpszAPIDelUser))) + { + XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; + if (!ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, &st_UserInfo)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求注册消息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + if (!DBModule_MQUser_UserDelete(&st_UserInfo)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_DELETE, _X("delete user failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求用户删除失败,删除数据库失败,错误:%lX"), lpszClientAddr, SessionModule_GetLastError()); + return false; + } + if (_tcsxlen(st_ServiceCfg.st_XPass.tszPassUNReg) > 0) + { + int nHTTPCode = 0; + XCLIENT_APIHTTP st_HTTPParament; + memset(&st_HTTPParament, '\0', sizeof(XCLIENT_APIHTTP)); + + st_HTTPParament.nTimeConnect = 2; + + ProtocolModule_Packet_PassUser(&st_UserInfo, tszSDBuffer, &nSDLen, XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_AUTH_REQDELETE); + APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XPass.tszPassUNReg, tszSDBuffer, &nHTTPCode, NULL, NULL, NULL, NULL, &st_HTTPParament); + if (200 != nHTTPCode) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_APIDEL, _X("delete user failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求远程注销失败,错误:%lX,HTTPCode:%d"), lpszClientAddr, nHTTPCode); + } + } + XENGINE_DBUSERKEY st_UserKey; + XENGINE_DBTOPICOWNER st_DBOwner; + + memset(&st_UserKey, '\0', sizeof(XENGINE_DBUSERKEY)); + memset(&st_DBOwner, '\0', sizeof(XENGINE_DBTOPICOWNER)); + + _tcsxcpy(st_UserKey.tszUserName, st_UserInfo.tszUserName); + _tcsxcpy(st_DBOwner.tszUserName, st_UserInfo.tszUserName); + + DBModule_MQUser_KeyDelete(&st_UserKey); + DBModule_MQUser_OwnerDelete(&st_DBOwner); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求用户删除成功,用户名:%s"), lpszClientAddr, st_UserInfo.tszUserName); + } else if (0 == _tcsxncmp(lpszAPIGetUser, lpszFuncName, _tcsxlen(lpszAPIGetUser))) { //用户 http://127.0.0.1:5202/api?function=getuser @@ -106,6 +171,35 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP BaseLib_Memory_Free((XPPPMEM)&ppSt_UserInfo, nListCount); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取用户列表请求成功,获取到的用户列表个数:%d"), lpszClientAddr, nListCount); } + else if (0 == _tcsxncmp(lpszAPIGetTopic, lpszFuncName, _tcsxlen(lpszAPIGetTopic))) + { + //主题 http://127.0.0.1:5202/api?function=gettopic + int nDBCount = 0; + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求获取主题信息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + DBModule_MQData_GetLeftCount(st_MQProtocol.tszMQKey, 0, &nDBCount); + ProtocolModule_Packet_TopicName(tszSDBuffer, &nSDLen, st_MQProtocol.tszMQKey, nDBCount); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,获取主题信息成功,主题名称:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); + } + else if (0 == _tcsxncmp(lpszAPIGetList, lpszFuncName, _tcsxlen(lpszAPIGetList))) + { + //主题 http://127.0.0.1:5202/api?function=getlist + int nListCount = 0; + XCHAR** ppszTableName; + DBModule_MQData_ShowTable(&ppszTableName, &nListCount); + ProtocolModule_Packet_TopicList(tszSDBuffer, &nSDLen, &ppszTableName, nListCount); + BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取主题列表请求成功,获取到的主题列表个数:%d"), lpszClientAddr, nListCount); + } else if (0 == _tcsxncmp(lpszAPIGetOnline, lpszFuncName, _tcsxlen(lpszAPIGetOnline))) { //获取在线用户 http://127.0.0.1:5202/api?function=getonline @@ -156,40 +250,104 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,获取主题序列编号成功,主题名称:%s,队列个数:%lld,开始编号:%lld,结尾编号:%lld"), lpszClientAddr, st_MQNumber.tszMQKey, st_MQNumber.nCount, st_MQNumber.nFirstNumber, st_MQNumber.nLastNumber); } - else if (0 == _tcsxncmp(lpszAPIGetTopic, lpszFuncName, _tcsxlen(lpszAPIGetTopic))) + else if (0 == _tcsxncmp(lpszAPIBind, lpszFuncName, _tcsxlen(lpszAPIBind))) { - //主题 http://127.0.0.1:5202/api?function=gettopic - int nDBCount = 0; XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求绑定主题失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + XENGINE_DBUSERKEY st_Userkey = {}; + _tcsxcpy(st_Userkey.tszUserName, st_MQProtocol.tszMQUsr); + _tcsxcpy(st_Userkey.tszKeyName, st_MQProtocol.tszMQKey); + //先查询有没有 + if (DBModule_MQUser_KeyQuery(&st_Userkey)) + { + //有就更新 + st_Userkey.nKeySerial = st_MQProtocol.nSerial; + if (!DBModule_MQUser_KeyUPDate(&st_Userkey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("update bind topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,设置消息队列主题更新失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); + return false; + } + } + else + { + //没有就创建 + st_Userkey.nKeySerial = st_MQProtocol.nSerial; + if (!DBModule_MQUser_KeyInsert(&st_Userkey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("insert bind topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,设置消息队列主题创建失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); + return false; + } + } + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,请求设置序列号成功,主题名称:%s,序列号:%lld"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial); + } + else if (0 == _tcsxncmp(lpszAPIUMBind, lpszFuncName, _tcsxlen(lpszAPIUMBind))) + { + XENGINE_DBUSERKEY st_Userkey = {}; + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求获取主题信息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求解绑主题失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); return false; } - DBModule_MQData_GetLeftCount(st_MQProtocol.tszMQKey, 0, &nDBCount); - ProtocolModule_Packet_TopicName(tszSDBuffer, &nSDLen, st_MQProtocol.tszMQKey, nDBCount); + _tcsxcpy(st_Userkey.tszUserName, st_MQProtocol.tszMQUsr); + _tcsxcpy(st_Userkey.tszKeyName, st_MQProtocol.tszMQKey); + + if (!DBModule_MQUser_KeyDelete(&st_Userkey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("unbind topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,解除消息绑定订阅失败,可能没有找到主题用户,主题名称:%s,用户名称:%s,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.tszMQUsr, DBModule_GetLastError()); + return false; + } + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,获取主题信息成功,主题名称:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,解除消息绑定成功,主题名称:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); } - else if (0 == _tcsxncmp(lpszAPIGetList, lpszFuncName, _tcsxlen(lpszAPIGetList))) + else if (0 == _tcsxncmp(lpszAPIUNReadMsg, lpszFuncName, _tcsxlen(lpszAPIUNReadMsg))) { - //主题 http://127.0.0.1:5202/api?function=getlist + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求未读消息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } int nListCount = 0; - XCHAR** ppszTableName; - DBModule_MQData_ShowTable(&ppszTableName, &nListCount); - ProtocolModule_Packet_TopicList(tszSDBuffer, &nSDLen, &ppszTableName, nListCount); - BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); + XENGINE_DBUSERKEY** ppSt_UserKey; + DBModule_MQUser_KeyList(st_MQProtocol.tszMQUsr, _X(""), &ppSt_UserKey, &nListCount); + ProtocolModule_Packet_UNReadMsg(tszSDBuffer, &nSDLen, &ppSt_UserKey, nListCount); + BaseLib_Memory_Free((XPPPMEM)&ppSt_UserKey, nListCount); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取主题列表请求成功,获取到的主题列表个数:%d"), lpszClientAddr, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,请求未读消息成功,用户名:%s,发送未读消息成功,发送的主题个数:%d"), lpszClientAddr, st_MQProtocol.tszMQUsr, nListCount); } else if (0 == _tcsxncmp(lpszAPICreateTopic, lpszFuncName, _tcsxlen(lpszAPICreateTopic))) { //http://127.0.0.1:5202/api?function=createtopic XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求创建主题失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); + return false; + } if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("request json parse failure")); @@ -248,6 +406,13 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XENGINE_DBTIMERELEASE st_DBInfo = {}; XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求删除主题失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); + return false; + } if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); @@ -291,6 +456,13 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; XENGINE_DBMESSAGEQUEUE st_MessageQueue = {}; + if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求删除消息失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); + return false; + } if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); @@ -320,59 +492,17 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,删除消息数据成功主题:%s,序列:%lld,"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MessageQueue.nQueueSerial); } - else if (0 == _tcsxncmp(lpszAPIDelUser, lpszFuncName, _tcsxlen(lpszAPIDelUser))) + else if (0 == _tcsxncmp(lpszAPIModifyMsg, lpszFuncName, _tcsxlen(lpszAPIModifyMsg))) { - XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; - if (!ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, &st_UserInfo)) - { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求注册消息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); - return false; - } - if (!DBModule_MQUser_UserDelete(&st_UserInfo)) + XENGINE_DBMESSAGEQUEUE st_DBQueue = {}; + + if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_DELETE, _X("delete user failure")); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求用户删除失败,删除数据库失败,错误:%lX"), lpszClientAddr, SessionModule_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求修改消息失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); return false; } - if (_tcsxlen(st_ServiceCfg.st_XPass.tszPassUNReg) > 0) - { - int nHTTPCode = 0; - XCLIENT_APIHTTP st_HTTPParament; - memset(&st_HTTPParament, '\0', sizeof(XCLIENT_APIHTTP)); - - st_HTTPParament.nTimeConnect = 2; - - ProtocolModule_Packet_PassUser(&st_UserInfo, tszSDBuffer, &nSDLen, XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_AUTH_REQDELETE); - APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XPass.tszPassUNReg, tszSDBuffer, &nHTTPCode, NULL, NULL, NULL, NULL, &st_HTTPParament); - if (200 != nHTTPCode) - { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_APIDEL, _X("delete user failure")); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求远程注销失败,错误:%lX,HTTPCode:%d"), lpszClientAddr, nHTTPCode); - } - } - XENGINE_DBUSERKEY st_UserKey; - XENGINE_DBTOPICOWNER st_DBOwner; - - memset(&st_UserKey, '\0', sizeof(XENGINE_DBUSERKEY)); - memset(&st_DBOwner, '\0', sizeof(XENGINE_DBTOPICOWNER)); - - _tcsxcpy(st_UserKey.tszUserName, st_UserInfo.tszUserName); - _tcsxcpy(st_DBOwner.tszUserName, st_UserInfo.tszUserName); - - DBModule_MQUser_KeyDelete(&st_UserKey); - DBModule_MQUser_OwnerDelete(&st_DBOwner); - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求用户删除成功,用户名:%s"), lpszClientAddr, st_UserInfo.tszUserName); - } - else if (0 == _tcsxncmp(lpszAPIModifyMsg, lpszFuncName, _tcsxlen(lpszAPIModifyMsg))) - { - XENGINE_DBMESSAGEQUEUE st_DBQueue = {}; - if (!ProtocolModule_Parse_MessageQueue(lpszMsgBuffer, nMsgLen, &st_DBQueue)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); @@ -398,6 +528,13 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XCHAR tszDstTopic[XPATH_MIN] = {}; XCHAR tszUserName[XPATH_MIN] = {}; + if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求修改主题失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); + return false; + } if (!ProtocolModule_Parse_ModifyTopic(lpszMsgBuffer, nMsgLen, tszSrcTopic, tszDstTopic, tszUserName)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); @@ -433,92 +570,6 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,修改主题名称成功,原名称:%s,目标名:%s"), lpszClientAddr, tszSrcTopic, tszDstTopic); } - else if (0 == _tcsxncmp(lpszAPIBind, lpszFuncName, _tcsxlen(lpszAPIBind))) - { - XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) - { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求绑定主题失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); - return false; - } - XENGINE_DBUSERKEY st_Userkey = {}; - - _tcsxcpy(st_Userkey.tszUserName, st_MQProtocol.tszMQUsr); - _tcsxcpy(st_Userkey.tszKeyName, st_MQProtocol.tszMQKey); - //先查询有没有 - if (DBModule_MQUser_KeyQuery(&st_Userkey)) - { - //有就更新 - st_Userkey.nKeySerial = st_MQProtocol.nSerial; - if (!DBModule_MQUser_KeyUPDate(&st_Userkey)) - { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("update bind topic is failure")); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,设置消息队列主题更新失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); - return false; - } - } - else - { - //没有就创建 - st_Userkey.nKeySerial = st_MQProtocol.nSerial; - if (!DBModule_MQUser_KeyInsert(&st_Userkey)) - { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("insert bind topic is failure")); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,设置消息队列主题创建失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); - return false; - } - } - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,请求设置序列号成功,主题名称:%s,序列号:%lld"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial); - } - else if (0 == _tcsxncmp(lpszAPIUMBind, lpszFuncName, _tcsxlen(lpszAPIUMBind))) - { - XENGINE_DBUSERKEY st_Userkey = {}; - XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) - { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求解绑主题失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); - return false; - } - _tcsxcpy(st_Userkey.tszUserName, st_MQProtocol.tszMQUsr); - _tcsxcpy(st_Userkey.tszKeyName, st_MQProtocol.tszMQKey); - - if (!DBModule_MQUser_KeyDelete(&st_Userkey)) - { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("unbind topic is failure")); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,解除消息绑定订阅失败,可能没有找到主题用户,主题名称:%s,用户名称:%s,错误:%lX"),lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.tszMQUsr, DBModule_GetLastError()); - return false; - } - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,解除消息绑定成功,主题名称:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); - } - else if (0 == _tcsxncmp(lpszAPIUNReadMsg, lpszFuncName, _tcsxlen(lpszAPIUNReadMsg))) - { - XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) - { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求未读消息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); - return false; - } - int nListCount = 0; - XENGINE_DBUSERKEY** ppSt_UserKey; - DBModule_MQUser_KeyList(st_MQProtocol.tszMQUsr, _X(""), &ppSt_UserKey, &nListCount); - ProtocolModule_Packet_UNReadMsg(tszSDBuffer, &nSDLen, &ppSt_UserKey, nListCount); - BaseLib_Memory_Free((XPPPMEM)&ppSt_UserKey, nListCount); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,请求未读消息成功,用户名:%s,发送未读消息成功,发送的主题个数:%d"), lpszClientAddr, st_MQProtocol.tszMQUsr, nListCount); - } else { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, _X("protocol not support")); diff --git a/XEngine_Source/XQueue_ProtocolHdr.h b/XEngine_Source/XQueue_ProtocolHdr.h index a02c113..51b48ff 100644 --- a/XEngine_Source/XQueue_ProtocolHdr.h +++ b/XEngine_Source/XQueue_ProtocolHdr.h @@ -54,6 +54,7 @@ #define ERROR_XENGINE_MESSAGE_HTTP_MISS 0x211 //缺少关键数据 #define ERROR_XENGINE_MESSAGE_HTTP_EXIST 0x212 //数据已存在 #define ERROR_XENGINE_MESSAGE_HTTP_FAILURE 0x213 //操作失败 +#define ERROR_XENGINE_MESSAGE_HTTP_PERMISSION 0x214 //权限错误 /////////////////////////////////////////////////////////////////////////// // 导出的数据结构 /////////////////////////////////////////////////////////////////////////// From 3dbd41060c1df309f4b218307b44a8f43c99f359 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 27 Feb 2026 14:19:04 +0800 Subject: [PATCH 18/23] added:permission control of build switch modify:tcp login permission handle --- XEngine_Source/XEngine_MQServiceApp.sln | 1 + .../MQService_HTTPTask/MQService_HTTPPost.cpp | 17 ++++++++++++++--- .../XEngine_MQServiceApp/MQService_Hdr.h | 1 + .../XEngine_MQServiceApp/MQService_TCPTask.cpp | 8 ++++++++ XEngine_Source/XQueue_BuildSwtich.h | 13 +++++++++++++ 5 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 XEngine_Source/XQueue_BuildSwtich.h diff --git a/XEngine_Source/XEngine_MQServiceApp.sln b/XEngine_Source/XEngine_MQServiceApp.sln index 3e25035..c963bf0 100644 --- a/XEngine_Source/XEngine_MQServiceApp.sln +++ b/XEngine_Source/XEngine_MQServiceApp.sln @@ -32,6 +32,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MQCore_SessionModule", "MQC EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MQCore_Hdr", "MQCore_Hdr", "{3A9FE48B-7FD1-4D02-8ED7-7521DC469765}" ProjectSection(SolutionItems) = preProject + XQueue_BuildSwtich.h = XQueue_BuildSwtich.h XQueue_ProtocolHdr.h = XQueue_ProtocolHdr.h EndProjectSection EndProject diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 1a9760d..53f1fca 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -26,9 +26,9 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP LPCXSTR lpszAPIBind = _X("bind"); LPCXSTR lpszAPIUMBind = _X("unbind"); LPCXSTR lpszAPIUNReadMsg = _X("unreadmsg"); + LPCXSTR lpszAPICreateTopic = _X("createtopic"); LPCXSTR lpszAPIDelTopic = _X("deletetopic"); - LPCXSTR lpszAPIDelMsg = _X("deletemsg"); LPCXSTR lpszAPIModifyMsg = _X("modifymsg"); LPCXSTR lpszAPIModifyTopic = _X("modifytopic"); @@ -340,7 +340,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP { //http://127.0.0.1:5202/api?function=createtopic XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - +#if (1 == __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__) if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); @@ -348,6 +348,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求创建主题失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); return false; } +#endif if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("request json parse failure")); @@ -405,7 +406,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XENGINE_DBUSERKEY st_UserKey = {}; XENGINE_DBTIMERELEASE st_DBInfo = {}; XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - +#if (1 == __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__) if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); @@ -413,6 +414,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求删除主题失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); return false; } +#endif if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); @@ -456,6 +458,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; XENGINE_DBMESSAGEQUEUE st_MessageQueue = {}; +#if (1 == __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__) if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); @@ -463,6 +466,8 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求删除消息失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); return false; } +#endif + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); @@ -496,6 +501,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP { XENGINE_DBMESSAGEQUEUE st_DBQueue = {}; +#if (1 == __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__) if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); @@ -503,6 +509,8 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求修改消息失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); return false; } +#endif + if (!ProtocolModule_Parse_MessageQueue(lpszMsgBuffer, nMsgLen, &st_DBQueue)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); @@ -528,6 +536,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XCHAR tszDstTopic[XPATH_MIN] = {}; XCHAR tszUserName[XPATH_MIN] = {}; +#if (1 == __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__) if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); @@ -535,6 +544,8 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求修改主题失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); return false; } +#endif + if (!ProtocolModule_Parse_ModifyTopic(lpszMsgBuffer, nMsgLen, tszSrcTopic, tszDstTopic, tszUserName)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h index 89e6ede..7504b20 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h @@ -56,6 +56,7 @@ using namespace std; #include "../XEngine_DependLibrary/XEngine_Module/XEngine_MSGNotify/MSGNotify_Define.h" #include "../XEngine_DependLibrary/XEngine_Module/XEngine_MSGNotify/MSGNotify_Error.h" #include "../XQueue_ProtocolHdr.h" +#include "../XQueue_BuildSwtich.h" #include "../MQCore_ConfigModule/Config_Define.h" #include "../MQCore_ConfigModule/Config_Error.h" #include "../MQCore_SessionModule/Session_Define.h" diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp index 6c640f9..f763515 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp @@ -145,6 +145,14 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC st_UserInfo.nUserState = 1; DBModule_MQUser_UserUPDate(&st_UserInfo); } + //权限是否正确 + if (ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_BAN == st_UserInfo.nUserLevel) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_AUTHORIZE, "permission error"); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s客户端:%s,用户名:%s,登录失败,客户端权限不足够"), lpszClientAddr, st_UserInfo.tszUserName); + return false; + } pSt_ProtocolHdr->wReserve = 0; SessionModule_Client_Create(lpszClientAddr, &st_UserInfo, nNetType); ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, NULL, tszSDBuffer, &nSDLen); diff --git a/XEngine_Source/XQueue_BuildSwtich.h b/XEngine_Source/XQueue_BuildSwtich.h new file mode 100644 index 0000000..a6bb216 --- /dev/null +++ b/XEngine_Source/XQueue_BuildSwtich.h @@ -0,0 +1,13 @@ +#pragma once +/******************************************************************** +// Created: 2026/02/27 13:49:51 +// File Name: D:\XEngine_MQService\XEngine_Source\XQueue_BuildSwtich.h +// File Path: D:\XEngine_MQService\XEngine_Source +// File Base: XQueue_BuildSwtich +// File Ext: h +// Project: XEngine +// Author: qyt +// Purpose: 编译选项 +// History: +*********************************************************************/ +#define __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__ 0 \ No newline at end of file From a0f6cf84c419521854631b5d32d678d1f17be383 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 27 Feb 2026 14:57:29 +0800 Subject: [PATCH 19/23] modify:example --- .../MQCore_HTTPApp/MQCore_HTTPApp.cpp | 128 ++++++++- XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp | 264 ------------------ XEngine_Apps/MQCore_WSApp/MQCore_WSApp.cpp | 114 -------- 3 files changed, 125 insertions(+), 381 deletions(-) diff --git a/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp b/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp index 22f52ca..6ebb118 100644 --- a/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp +++ b/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp @@ -22,6 +22,53 @@ //VS2022 Debug x86 Compile //g++ -std=c++17 -Wall -g MQCore_HTTPApp.cpp -o MQCore_HTTPApp.exe -lXEngine_BaseLib -lXClient_APIHelp __int64x xhToken = 0; + +//获取未读消息 +void MQ_GetUNRead() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=unreadmsg"); + + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + + st_JsonObject["tszMQUsr"] = "123123aa"; + st_JsonObject["tszMQKey"] = "XEngine_MSGKeyName"; + st_JsonRoot["xhToken"] = xhToken; + st_JsonRoot["Object"] = st_JsonObject; + + int nLen = 0; + XCHAR* ptszMsgBody = NULL; + if (!APIClient_Http_Request(_X("POST"), lpszPostUrl, st_JsonRoot.toStyledString().c_str(), NULL, &ptszMsgBody, &nLen)) + { + _xtprintf("发送投递失败!\n"); + return; + } + _xtprintf("MQ_GetUNRead:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} +void MQ_DelMsg() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=deletemsg"); + + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + + st_JsonObject["nSerial"] = 1; + st_JsonObject["tszMQKey"] = "XEngine_MSGKeyName"; + st_JsonRoot["xhToken"] = xhToken; + st_JsonRoot["Object"] = st_JsonObject; + + int nLen = 0; + XCHAR* ptszMsgBody = NULL; + if (!APIClient_Http_Request(_X("POST"), lpszPostUrl, st_JsonRoot.toStyledString().c_str(), NULL, &ptszMsgBody, &nLen)) + { + _xtprintf("发送投递失败!\n"); + return; + } + _xtprintf("MQ_DelMsg:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} + void MQ_UserRegister() { LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=register"); @@ -71,7 +118,7 @@ void MQ_UserLogin() } void MQ_UserDelete() { - LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=deluser"); + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=deleteuser"); Json::Value st_JsonRoot; Json::Value st_JsonUser; @@ -132,7 +179,32 @@ void MQ_TopicCreate() Json::Value st_JsonRoot; Json::Value st_JsonObject; - st_JsonObject["name"] = "topictest"; + st_JsonObject["tszMQUsr"] = "123123aa"; + st_JsonObject["tszMQKey"] = "topictest"; + + st_JsonRoot["xhToken"] = xhToken; + st_JsonRoot["Object"] = st_JsonObject; + + int nLen = 0; + XCHAR* ptszMsgBody = NULL; + if (!APIClient_Http_Request(_X("POST"), lpszPostUrl, st_JsonRoot.toStyledString().c_str(), NULL, &ptszMsgBody, &nLen)) + { + _xtprintf("发送投递失败!\n"); + return; + } + _xtprintf("MQ_TopicCreate:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} +void MQ_TopicModify() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=modifytopic"); + + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + + st_JsonObject["tszMQUsr"] = "123123aa"; + st_JsonObject["tszSrcTopic"] = "topictest"; + st_JsonObject["tszDstTopic"] = "topic2test"; st_JsonRoot["xhToken"] = xhToken; st_JsonRoot["Object"] = st_JsonObject; @@ -147,6 +219,7 @@ void MQ_TopicCreate() _xtprintf("MQ_TopicCreate:%s\n", ptszMsgBody); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); } + void MQ_TopicDelete() { LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=deletetopic"); @@ -154,7 +227,8 @@ void MQ_TopicDelete() Json::Value st_JsonRoot; Json::Value st_JsonObject; - st_JsonObject["name"] = "topictest"; + st_JsonObject["tszMQUsr"] = "123123aa"; + st_JsonObject["tszMQKey"] = "topic2test"; st_JsonRoot["xhToken"] = xhToken; st_JsonRoot["Object"] = st_JsonObject; @@ -169,6 +243,49 @@ void MQ_TopicDelete() _xtprintf("MQ_TopicDelete:%s\n", ptszMsgBody); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); } +void MQ_GetTopic() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=gettopic"); + + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + + st_JsonRoot["xhToken"] = xhToken; + st_JsonObject["tszMQKey"] = "topictest"; + st_JsonRoot["Object"] = st_JsonObject; + + int nLen = 0; + XCHAR* ptszMsgBody = NULL; + if (!APIClient_Http_Request(_X("POST"), lpszPostUrl, st_JsonRoot.toStyledString().c_str(), NULL, &ptszMsgBody, &nLen)) + { + _xtprintf("发送投递失败!\n"); + return; + } + _xtprintf("MQ_GetTopic:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} +void MQ_GetNumber() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=getnumber"); + + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + + st_JsonObject["nKeepTime"] = 1; + st_JsonObject["tszMQKey"] = "XEngine_CommKey"; + st_JsonRoot["xhToken"] = xhToken; + st_JsonRoot["Object"] = st_JsonObject; + + int nLen = 0; + XCHAR* ptszMsgBody = NULL; + if (!APIClient_Http_Request(_X("POST"), lpszPostUrl, st_JsonRoot.toStyledString().c_str(), NULL, &ptszMsgBody, &nLen)) + { + _xtprintf("发送投递失败!\n"); + return; + } + _xtprintf("MQ_GetNumber:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} void MQ_GetTopicList() { LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=getlist"); @@ -196,12 +313,17 @@ int main() MQ_UserRegister(); MQ_UserLogin(); + MQ_GetUNRead(); MQ_GetUserList(); MQ_GetOnlineList(); MQ_TopicCreate(); + MQ_GetTopic(); + MQ_GetNumber(); MQ_GetTopicList(); + MQ_TopicModify(); MQ_TopicDelete(); MQ_UserDelete(); + #ifdef _MSC_BUILD WSACleanup(); #endif diff --git a/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp b/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp index c4100ac..099a40c 100644 --- a/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp +++ b/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp @@ -83,113 +83,6 @@ void MQ_Authorize() BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } } -//获取未读消息 -void MQ_GetUNRead(int nType = 0) -{ - int nLen = 0; - XENGINE_PROTOCOLHDR st_ProtocolHdr; - XENGINE_PROTOCOL_XMQ st_XMQProtocol; - XCHAR tszMsgBuffer[2048]; - - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUNREAD; - st_ProtocolHdr.byVersion = 1; - st_ProtocolHdr.byIsReply = true; //必须为真 - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - - nLen = sizeof(XENGINE_PROTOCOLHDR) + st_ProtocolHdr.unPacketSize; - memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); - -#if 1 == XENGINE_CRYPTION_DATA_ENABLE - Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); -#endif - - if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - - while (true) - { - nLen = 0; - XCHAR* ptszMsgBuffer; - - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - if (XClient_TCPSelect_RecvPkt(m_Socket, &ptszMsgBuffer, &nLen, &st_ProtocolHdr)) - { -#if 1 == XENGINE_CRYPTION_DATA_ENABLE - Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); -#endif - if (0 == st_ProtocolHdr.wReserve) - { - _xtprintf("接受到数据,长度:%d,内容:%s\n", st_ProtocolHdr.unPacketSize, ptszMsgBuffer); - } - else - { - _xtprintf("获取消息队列数据失败,错误码:%d\n", st_ProtocolHdr.wReserve); - } - BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } -} - -void MQ_Create() -{ - int nLen = 0; - XENGINE_PROTOCOLHDR st_ProtocolHdr; - XENGINE_PROTOCOL_XMQ st_XMQProtocol; - XCHAR tszMsgBuffer[2048]; - - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICCREATE; - st_ProtocolHdr.byVersion = 1; - st_ProtocolHdr.byIsReply = true; //获得处理返回结果 - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - strcpy(st_XMQProtocol.tszMQKey, lpszKey); - - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - - nLen = sizeof(XENGINE_PROTOCOLHDR) + st_ProtocolHdr.unPacketSize; - memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); - -#if 1 == XENGINE_CRYPTION_DATA_ENABLE - Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); -#endif - if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - nLen = 2048; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nLen)) - { - _xtprintf("接受数据失败!\n"); - return; - } - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - memcpy(&st_ProtocolHdr, tszMsgBuffer, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(&st_XMQProtocol, tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), sizeof(XENGINE_PROTOCOL_XMQ)); -} typedef struct { @@ -468,158 +361,6 @@ void MQ_TimePublish() BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } -void MQ_GetNumber() -{ - int nLen = 0; - XENGINE_PROTOCOLHDR st_ProtocolHdr; - XENGINE_PROTOCOL_XMQ st_XMQProtocol; - XCHAR tszMsgBuffer[2048]; - - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQNUMBER; - st_ProtocolHdr.byVersion = 1; - st_ProtocolHdr.byIsReply = true; - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - strcpy(st_XMQProtocol.tszMQKey, lpszKey); - - nLen = sizeof(XENGINE_PROTOCOLHDR) + st_ProtocolHdr.unPacketSize; - memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); - -#if 1 == XENGINE_CRYPTION_DATA_ENABLE - Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); -#endif - if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - - nLen = 0; - XCHAR* ptszMsgBuffer = NULL; - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - - if (XClient_TCPSelect_RecvPkt(m_Socket, &ptszMsgBuffer, &nLen, &st_ProtocolHdr)) - { - XENGINE_MQNUMBER st_MQNumber = {}; - -#if 1 == XENGINE_CRYPTION_DATA_ENABLE - Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); -#endif - memcpy(&st_MQNumber, ptszMsgBuffer, sizeof(XENGINE_MQNUMBER)); - - if (0 == st_ProtocolHdr.wReserve) - { - nLastNumber = st_MQNumber.nLastNumber; - _xtprintf("接受到消息信息,主题:%s,个数:%lld,起始编号:%lld,结束编号:%lld\n", st_MQNumber.tszMQKey, st_MQNumber.nCount, st_MQNumber.nFirstNumber, st_MQNumber.nLastNumber); - } - else - { - _xtprintf("接受到消息信息失败,错误码:%d\n", st_ProtocolHdr.wReserve); - } - } -} -void MQ_BindTopic() -{ - int nLen = 0; - XENGINE_PROTOCOLHDR st_ProtocolHdr; - XENGINE_PROTOCOL_XMQ st_XMQProtocol; - XCHAR tszMsgBuffer[2048]; - - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND; - st_ProtocolHdr.byVersion = 1; - st_ProtocolHdr.byIsReply = true; - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - - st_XMQProtocol.nSerial = 1; //设置为1开始读取 - strcpy(st_XMQProtocol.tszMQKey, lpszKey); - - nLen = sizeof(XENGINE_PROTOCOLHDR) + st_ProtocolHdr.unPacketSize; - memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); - -#if 1 == XENGINE_CRYPTION_DATA_ENABLE - Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); -#endif - if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - - nLen = 0; - XCHAR* ptszMsgBuffer = NULL; - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - if (XClient_TCPSelect_RecvPkt(m_Socket, &ptszMsgBuffer, &nLen, &st_ProtocolHdr)) - { - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - -#if 1 == XENGINE_CRYPTION_DATA_ENABLE - Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); -#endif - memcpy(&st_XMQProtocol, ptszMsgBuffer, sizeof(XENGINE_PROTOCOL_XMQ)); - - if (0 == st_ProtocolHdr.wReserve) - { - _xtprintf("请求某个位置开始获取消息成功,主题:%s,序列号:%lld\n", st_XMQProtocol.tszMQKey, st_XMQProtocol.nSerial); - } - else - { - _xtprintf("请求某个位置开始获取消息失败,错误码:%d\n", st_ProtocolHdr.wReserve); - } - } -} - -//删除主题 -void MQ_DeleteTopic() -{ - int nLen = 0; - XENGINE_PROTOCOLHDR st_ProtocolHdr; - XENGINE_PROTOCOL_XMQ st_XMQProtocol; - XCHAR tszMsgBuffer[2048]; - - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICDELETE; - st_ProtocolHdr.byVersion = 1; - st_ProtocolHdr.byIsReply = true; //不获取结果 - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - strcpy(st_XMQProtocol.tszMQKey, lpszKey); - - nLen = sizeof(XENGINE_PROTOCOLHDR) + st_ProtocolHdr.unPacketSize; - memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); - -#if 1 == XENGINE_CRYPTION_DATA_ENABLE - Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); -#endif - if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } -} int main(int argc, char** argv) { @@ -638,10 +379,7 @@ int main(int argc, char** argv) MQ_Authorize(); //MQ_PostEMail("test for email"); - MQ_GetUNRead(); - MQ_Create(); MQ_Post(NULL, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_BIN, -1, true); - MQ_BindTopic(); MQ_Get(ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_BIN); MQ_Post(lpszMsgBuffer, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_STRING, 0); @@ -649,12 +387,10 @@ int main(int argc, char** argv) { MQ_Post(lpszMsgBuffer, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_STRING, -1, true); } - MQ_GetNumber(); MQ_Get(ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_STRING); MQ_Get(ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_STRING); MQ_Get(ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_STRING); MQ_TimePublish(); - MQ_DeleteTopic(); std::this_thread::sleep_for(std::chrono::seconds(1)); XClient_TCPSelect_Close(m_Socket); diff --git a/XEngine_Apps/MQCore_WSApp/MQCore_WSApp.cpp b/XEngine_Apps/MQCore_WSApp/MQCore_WSApp.cpp index 29d9bd8..40d122d 100644 --- a/XEngine_Apps/MQCore_WSApp/MQCore_WSApp.cpp +++ b/XEngine_Apps/MQCore_WSApp/MQCore_WSApp.cpp @@ -102,44 +102,6 @@ void MQ_Authorize() _xtprintf("MQ_Authorize:%s\n", tszMsgBuffer); } -void MQ_Create() -{ - int nLen = 0; - XCHAR tszMsgBuffer[2048]; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - - Json::Value st_JsonRoot; - Json::Value st_JsonMQProtocol; - st_JsonRoot["unOperatorType"] = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_JsonRoot["unOperatorCode"] = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICCREATE; - st_JsonRoot["byVersion"] = ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_JSON; - st_JsonRoot["byIsReply"] = 1; - - st_JsonMQProtocol["tszMQKey"] = lpszKey; - st_JsonMQProtocol["nSerial"] = 0; - st_JsonMQProtocol["nKeepTime"] = 0; - st_JsonMQProtocol["nGetTimer"] = 0; - - st_JsonRoot["st_MQProtocol"] = st_JsonMQProtocol; - - nLen = st_JsonRoot.toStyledString().length(); - memcpy(tszMsgBuffer, st_JsonRoot.toStyledString().c_str(), nLen); - - if (!MQ_SendPacket(tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - nLen = 2048; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!MQ_RecvPacket(tszMsgBuffer, &nLen)) - { - _xtprintf("接受数据失败!\n"); - return; - } - _xtprintf("MQ_Create:%s\n", tszMsgBuffer); -} - void MQ_Post(LPCXSTR lpszMsgBuffer) { int nLen = 0; @@ -192,79 +154,6 @@ void MQ_Post(LPCXSTR lpszMsgBuffer) _xtprintf("MQ_Post:%s\n", tszMsgBuffer); } - -void MQ_BindTopic() -{ - int nLen = 0; - XCHAR tszMsgBuffer[2048]; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - - Json::Value st_JsonRoot; - Json::Value st_JsonMQProtocol; - Json::Value st_JsonPayload; - st_JsonRoot["unOperatorType"] = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_JsonRoot["unOperatorCode"] = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND; - st_JsonRoot["byVersion"] = ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_JSON; - st_JsonRoot["byIsReply"] = 1; - - st_JsonMQProtocol["tszMQKey"] = lpszKey; - st_JsonMQProtocol["nSerial"] = 1; - - st_JsonRoot["st_MQProtocol"] = st_JsonMQProtocol; - - nLen = st_JsonRoot.toStyledString().length(); - memcpy(tszMsgBuffer, st_JsonRoot.toStyledString().c_str(), nLen); - - if (!MQ_SendPacket(tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - nLen = 2048; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!MQ_RecvPacket(tszMsgBuffer, &nLen)) - { - _xtprintf("接受数据失败!\n"); - return; - } - _xtprintf("MQ_GetOrder:%s\n", tszMsgBuffer); -} - -void MQ_GetNumber() -{ - int nLen = 0; - XCHAR tszMsgBuffer[2048]; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - - Json::Value st_JsonRoot; - Json::Value st_JsonMQProtocol; - Json::Value st_JsonPayload; - st_JsonRoot["unOperatorType"] = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_JsonRoot["unOperatorCode"] = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQNUMBER; - st_JsonRoot["byVersion"] = ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_JSON; - st_JsonRoot["byIsReply"] = 1; - - st_JsonMQProtocol["tszMQKey"] = lpszKey; - - st_JsonRoot["st_MQProtocol"] = st_JsonMQProtocol; - - nLen = st_JsonRoot.toStyledString().length(); - memcpy(tszMsgBuffer, st_JsonRoot.toStyledString().c_str(), nLen); - - if (!MQ_SendPacket(tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - nLen = 2048; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!MQ_RecvPacket(tszMsgBuffer, &nLen)) - { - _xtprintf("接受数据失败!\n"); - return; - } - _xtprintf("MQ_GetSerial:%s\n", tszMsgBuffer); -} void MQ_Get() { int nLen = 0; @@ -351,10 +240,7 @@ int main() _xtprintf("%s\n", tszMsgBuffer + nPos); } MQ_Authorize(); - MQ_Create(); MQ_Post("MTIzMTIz"); - MQ_GetNumber(); - MQ_BindTopic(); MQ_Get(); #ifdef _MSC_BUILD From 29cdf83fb26f0b876aa2fa60cda3d3dd56b78af3 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 28 Feb 2026 09:41:01 +0800 Subject: [PATCH 20/23] modify:create token of http when tcp login --- XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp | 7 +++++++ XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp index d792521..ce409db 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp @@ -161,6 +161,13 @@ void XEngine_MQXService_Close(LPCXSTR lpszClientAddr, int nIPProto, bool bHeart) } } DBModule_MQUser_UserUPDate(&st_UserInfo); + //释放token + XNETHANDLE xhToken = 0; + SessionModule_Client_GetInfoByUser(st_UserInfo.tszUserName, &st_UserInfo); + if (Session_Token_GetUser(st_UserInfo.tszUserName, st_UserInfo.tszUserPass, &xhToken)) + { + Session_Token_Delete(xhToken); + } } SessionModule_Client_Delete(lpszClientAddr); } diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp index f763515..afbb92b 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp @@ -153,6 +153,10 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s客户端:%s,用户名:%s,登录失败,客户端权限不足够"), lpszClientAddr, st_UserInfo.tszUserName); return false; } + //创建TOKEN + BaseLib_Handle_Create(&pSt_ProtocolHdr->xhToken); + Session_Token_Insert(pSt_ProtocolHdr->xhToken, &st_UserInfo); + pSt_ProtocolHdr->wReserve = 0; SessionModule_Client_Create(lpszClientAddr, &st_UserInfo, nNetType); ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, NULL, tszSDBuffer, &nSDLen); From f95754bc366ca7b3649a7f528de245ad1964c273 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 28 Feb 2026 10:04:49 +0800 Subject: [PATCH 21/23] update:readme and document --- README.en.md | 5 ++++- README.md | 6 +++++- XEngine_Docment/Docment_en.docx | Bin 134450 -> 130860 bytes XEngine_Docment/Docment_zh.docx | Bin 137813 -> 134888 bytes 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/README.en.md b/README.en.md index c967926..93e9089 100644 --- a/README.en.md +++ b/README.en.md @@ -19,7 +19,7 @@ this software support following features 3. message timeout 4. topic Partition 5. message tracking(planning) -6. encrypt Communication(planning) +6. encrypt Communication 7. load balanc(planning) 8. message get time 9. message subcribe @@ -38,6 +38,7 @@ this software support following features 22. http verification 23. email notify 24. sms notify(plan) +25. permission control ## install @@ -108,6 +109,8 @@ database you need to open the database matching fields and tables are consistent ## other problems You can refer to the document under the docment directory. It contains API protocol and service description. +#### Compiler Options +When __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__ == 1, permission control can be enabled. Only users with administrator privileges can operate critical permissions, and this is mainly intended for HTTP interfaces ## Test Server Address Address:app.xyry.org Port:TCP 5200,WEBSOCKET 5201,HTTP Management Interface 5202 diff --git a/README.md b/README.md index 63144b5..1644db1 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ c c++Message Service 3. 消息超时 4. 主题分区 5. 消息回溯 -6. 加密通信(planning) +6. 加密通信 7. 负载均衡(planning) 8. 消息次数 9. 消息订阅 @@ -40,6 +40,7 @@ c c++Message Service 22. http验证 23. 电子邮件通知 24. 短信通知(plan) +25. 权限控制 ## 安装教程 @@ -118,6 +119,9 @@ make FLAGS=CleanAll 清理编译 ## 其他问题 你可以参考docment目录下的文档.里面包含了API协议和服务说明. +#### 编译选项 +__XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__ == 1 可以开启权限控制,只有管理员权限才可以操作关键权限,主要用于HTTP接口 + ## 测试服务器 地址:app.xyry.org 端口:TCP 5200,WEBSOCKET 5201,管理接口HTTP 5202 diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index 43eade6fb922fa1931a117d2bbcf01d037e8e305..b3eb094be52f3f52a1524799ef934dd321e8780a 100644 GIT binary patch delta 109880 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 xfM;39FfMG62&%y;3d{u?B!{{xM;XEgu- delta 113445 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

JK+FtO)Hh&Uh0o&Ee#R6gaC8`gLVIbJDm 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 diff --git a/XEngine_Docment/Docment_zh.docx b/XEngine_Docment/Docment_zh.docx index 0da0a4b54134e64fa1873cb990c97d3e7ef154dd..18d2e251613e284d6a95b705f51066dd2859d405 100644 GIT binary patch delta 114490 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 z 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 MtPBh>B0v)v0C1oAF8}}l From cfd3827a1925410604af2b218e5588b420e8d2c8 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 28 Feb 2026 10:13:56 +0800 Subject: [PATCH 22/23] update:CHANGELOG modify:mqtt protcol bind and unbind does not post tcp handle and mqtt protocol process modify --- CHANGELOG | 36 ++++++++ .../MQService_MQTTTask.cpp | 89 +++++++++++++++++++ 2 files changed, 125 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index a340d7c..019df1b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,39 @@ +XEngine_MQService V3.19.0.1001 + +增加:权限控制开关 +增加:数据传输加密支持 +更新:依赖库 +修改:mqtt协议的订阅和取消订阅不在交给tcp处理并且mqtt协议流程代码修改 +修改:当tcp登录的时候会创建http的token了 +修改:重构了tcp和http协议,现在大部分消息处理都通过http实现,tcp只处理投递订阅和获取消息 +修改:绑定消息协议字符串 +修改:协议消息统一 +修改:权限控制和处理 +修改:tcp登录权限处理 +修正:某些时候协议没有响应和解析问题 +修正:当post的协议找不到的时候没有响应问题 +修正:当没有找到http协议的时候无响应问题 +删除:http公用消息打包函数 +删除:多余的协议错误定义 + +added:permission control of build switch +added:data transfer crypt +update:depend library +modify:mqtt protcol bind and unbind does not post tcp handle and mqtt protocol process modify +modify:create token of http when tcp login +modify:Reconstruct the TCP and HTTP protocols,now the data processed by the HTTP protocol is no longer handed over to the TCP for processing +modify:message and topic modify and request message number to http protocol +modify:does not case-sensitive +modify:bind message protocol string +modify:protocol user unified +modify:permission management and process +modify:tcp login permission handle +fixed:some protocol not reply and parse process failure +fixed:no reply when not found post protocol +fixed:http protocol not reply when not found protocol +delete:http comm message packet +delete:more protocol error define +====================================================================================== XEngine_MQService V3.18.0.1001 ci:增加CentOS和Alma以及debian13系统支持 diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp index 265fa58..4a46f34 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp @@ -108,6 +108,95 @@ bool MQService_MQTT_Handle(LPCXSTR lpszClientAddr, MQTTPROTOCOL_FIXEDHEADER* pSt MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_ProtocolAuth, sizeof(XENGINE_PROTOCOL_USERAUTH), XENGINE_MQAPP_NETTYPE_MQTT); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求链接成功,客户端ID:%s,用户名:%s"), lpszClientAddr, st_USerInfo.tszClientID, st_USerInfo.tszClientUser); + return true; + } + + XCHAR tszUserName[XPATH_MIN] = {}; + if (!SessionModule_Client_GetUser(lpszClientAddr, tszUserName)) + { + MQTTProtocol_Packet_DisConnect(tszRVBuffer, &nRVLen); + MQTTProtocol_Packet_Header(tszSDBuffer, &nSDLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_DISCONN, tszRVBuffer, nRVLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_MQTT); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求指定消息:%d 失败,用户未登录,错误码:%lX"), lpszClientAddr, pSt_MQTTHdr->byMsgType, MQTTProtocol_GetLastError()); + return false; + } + if (XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_SUBSCRIBE == pSt_MQTTHdr->byMsgType) + { + XSHOT wMsgID = 0; + XCHAR tszTopicName[XPATH_MAX] = {}; + int nListCount = 0; + MQTTPROTOCOL_HDRPROPERTY** ppSt_HDRProperty; + MQTTPROTOCOL_HDRSUBSCRIBE st_SubScribe = {}; + + if (!MQTTProtocol_Parse_Subscribe(lpszMSGBuffer, nMSGLen, &wMsgID, tszTopicName, &st_SubScribe, &ppSt_HDRProperty, &nListCount)) + { + MQTTProtocol_Packet_DisConnect(tszRVBuffer, &nRVLen); + MQTTProtocol_Packet_Header(tszSDBuffer, &nSDLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_DISCONN, tszRVBuffer, nRVLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_MQTT); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求订阅失败,错误码:%lX"), lpszClientAddr, MQTTProtocol_GetLastError()); + return false; + } + XENGINE_DBUSERKEY st_Userkey = {}; + + _tcsxcpy(st_Userkey.tszUserName, tszUserName); + _tcsxcpy(st_Userkey.tszKeyName, tszTopicName); + //先查询有没有 + if (DBModule_MQUser_KeyQuery(&st_Userkey)) + { + //有就更新 + st_Userkey.nKeySerial = wMsgID; + if (!DBModule_MQUser_KeyUPDate(&st_Userkey)) + { + MQTTProtocol_Packet_DisConnect(tszRVBuffer, &nRVLen); + MQTTProtocol_Packet_Header(tszSDBuffer, &nSDLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_DISCONN, tszRVBuffer, nRVLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_MQTT); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("MQTT消息端:%s,设置消息队列主题更新失败,主题名称:%s,序列号:%d,错误:%lX"), lpszClientAddr, tszTopicName, wMsgID, DBModule_GetLastError()); + return false; + } + } + else + { + //没有就创建 + st_Userkey.nKeySerial = wMsgID; + if (!DBModule_MQUser_KeyInsert(&st_Userkey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("insert bind topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("MQTT消息端:%s,设置消息队列主题创建失败,主题名称:%s,序列号:%d,错误:%lX"), lpszClientAddr, tszTopicName, wMsgID, DBModule_GetLastError()); + return false; + } + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求订阅成功,主题名称:%s"), lpszClientAddr, tszTopicName); + } + else if (XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_UNSUBSCRIBE == pSt_MQTTHdr->byMsgType) + { + XSHOT wMsgID = 0; + XCHAR tszTopicName[XPATH_MAX] = {}; + int nListCount = 0; + MQTTPROTOCOL_HDRPROPERTY** ppSt_HDRProperty; + + if (!MQTTProtocol_Parse_UNSubcribe(lpszMSGBuffer, nMSGLen, &wMsgID, tszTopicName, &ppSt_HDRProperty, &nListCount)) + { + MQTTProtocol_Packet_DisConnect(tszRVBuffer, &nRVLen); + MQTTProtocol_Packet_Header(tszSDBuffer, &nSDLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_DISCONN, tszRVBuffer, nRVLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_MQTT); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求取消订阅失败,错误码:%lX"), lpszClientAddr, MQTTProtocol_GetLastError()); + return false; + } + XENGINE_DBUSERKEY st_Userkey = {}; + + _tcsxcpy(st_Userkey.tszUserName, tszUserName); + _tcsxcpy(st_Userkey.tszKeyName, tszTopicName); + + if (!DBModule_MQUser_KeyDelete(&st_Userkey)) + { + MQTTProtocol_Packet_DisConnect(tszRVBuffer, &nRVLen); + MQTTProtocol_Packet_Header(tszSDBuffer, &nSDLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_DISCONN, tszRVBuffer, nRVLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_MQTT); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("MQTT消息端:%s,解除消息绑定订阅失败,可能没有找到主题用户,主题名称:%s,用户名称:%s,错误:%lX"), lpszClientAddr, tszTopicName, tszUserName, DBModule_GetLastError()); + return false; + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求取消订阅,主题名称:%s"), lpszClientAddr, tszTopicName); } else if (XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_PUBLISH == pSt_MQTTHdr->byMsgType) { From 6c1d4ae5ff7109a91f60157db3b26584441d1ce8 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 28 Feb 2026 10:24:49 +0800 Subject: [PATCH 23/23] update:version configure --- XEngine_Release/XEngine_Config/XEngine_VerConfig.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/XEngine_Release/XEngine_Config/XEngine_VerConfig.json b/XEngine_Release/XEngine_Config/XEngine_VerConfig.json index 296adc0..e663a9f 100644 --- a/XEngine_Release/XEngine_Config/XEngine_VerConfig.json +++ b/XEngine_Release/XEngine_Config/XEngine_VerConfig.json @@ -1,6 +1,8 @@ { "XVer":[ - "3.17.0.1001 Build20250901", + "3.19.0.1001 Build20260228", + "3.18.0.1001 Build20251016", + "3.17.0.1001 Build20250907", "3.16.0.1001 Build20250524", "3.15.0.1001 Build20250313", "3.14.0.1001 Build20250120",