From a2cb4cbe14fbfbdede16eaf8bbcc1956d270eb06 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 10 May 2025 11:36:15 +0800 Subject: [PATCH 01/28] update:depend library --- XEngine_Source/XEngine_Depend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend index fda9f7d..2dd56fa 160000 --- a/XEngine_Source/XEngine_Depend +++ b/XEngine_Source/XEngine_Depend @@ -1 +1 @@ -Subproject commit fda9f7d9140cc6a32eecb499e2acb67e8e1c7e6f +Subproject commit 2dd56facd7c93dfd3810d1db4341fff469e0786b From 4a548e4d8764019617ea701a214f4ed70a047406 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 10 May 2025 11:45:02 +0800 Subject: [PATCH 02/28] ci:add more release support --- .github/workflows/RockyArm64_build.yml | 78 ---------- ...{RockyX86_64_build.yml => Rocky_build.yml} | 29 ++-- .github/workflows/UbuntuArm64_build.yml | 74 ---------- .github/workflows/UbuntuX86_64_build.yml | 90 ------------ .github/workflows/Ubuntu_build.yml | 136 ++++++++++++++++++ .github/workflows/debian_build.yml | 87 +++++++++++ .github/workflows/release.yml | 21 +-- 7 files changed, 248 insertions(+), 267 deletions(-) delete mode 100644 .github/workflows/RockyArm64_build.yml rename .github/workflows/{RockyX86_64_build.yml => Rocky_build.yml} (72%) delete mode 100644 .github/workflows/UbuntuArm64_build.yml delete mode 100644 .github/workflows/UbuntuX86_64_build.yml create mode 100644 .github/workflows/Ubuntu_build.yml create mode 100644 .github/workflows/debian_build.yml diff --git a/.github/workflows/RockyArm64_build.yml b/.github/workflows/RockyArm64_build.yml deleted file mode 100644 index afeca0e..0000000 --- a/.github/workflows/RockyArm64_build.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: rocky Arm64 build workflows - -on: - push: - branches: - - 'develop' - paths: - - 'XEngine_Source/**' - - 'XEngine_Release/**' - - '.github/**' - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-24.04 - env: - IMAGE_NAME: rockylinux/rockylinux:9.5 - - strategy: - fail-fast: false - matrix: - arch: [linux/arm64] - - steps: - # 检出您的主仓库代码 - - name: Checkout main repository code - uses: actions/checkout@v4 - with: - ref: 'develop' - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Build ${{ matrix.arch }} - run: | - docker run --platform ${{ matrix.arch }} --rm \ - -v ${{ github.workspace }}:/workspace \ - -w /workspace ${{ env.IMAGE_NAME }} /bin/sh -c ' - set -e - dnf update -y - dnf install --allowerasing git make g++ wget curl jq unzip -y - - git config --global --add safe.directory /workspace - git submodule init - git submodule update - - latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) - wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_RockyLinux_9_Arm64.zip - unzip ./XEngine_RockyLinux_9_Arm64.zip -d ./XEngine_RockyLinux_9_Arm64 - cd XEngine_RockyLinux_9_Arm64 - - chmod 777 ./XEngine_LINEnv.sh - ./XEngine_LINEnv.sh -i 0 - - cp -rf ./XEngine_Include /usr/local/include - find ./XEngine_Linux -name "*.so" -exec cp {} /usr/lib64 \; - ldconfig - cd .. - - cd XEngine_Source - make ARCH=Arm64 RELEASE=1 - make FLAGS=InstallAll - make FLAGS=CleanAll - cd .. - - cd XEngine_Release - ./XEngine_MQServiceApp -t - chown -R $(id -u):$(id -g) . - chmod -R a+r . ' - - - name: Upload folder as artifact with RockyLinux - uses: actions/upload-artifact@v4 - with: - name: XEngine_MQServiceApp-RockyLinux_9_Arm64 - path: XEngine_Release/ - retention-days: 1 diff --git a/.github/workflows/RockyX86_64_build.yml b/.github/workflows/Rocky_build.yml similarity index 72% rename from .github/workflows/RockyX86_64_build.yml rename to .github/workflows/Rocky_build.yml index c8ef9ee..6258bd6 100644 --- a/.github/workflows/RockyX86_64_build.yml +++ b/.github/workflows/Rocky_build.yml @@ -1,4 +1,4 @@ -name: rocky x86_64 build workflows +name: rocky build workflows on: push: @@ -14,18 +14,28 @@ permissions: jobs: build: - runs-on: ubuntu-latest + runs-on: ${{ matrix.runner }} container: image: rockylinux/rockylinux:9.5 + options: --platform ${{ matrix.platform }} + strategy: + matrix: + include: + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + artifact: x86-64 + - arch: arm64 + runner: ubuntu-24.04-arm + platform: linux/arm64 + artifact: Arm64 steps: - # 检出您的主仓库代码 - name: Checkout main repository code uses: actions/checkout@v4 with: ref: 'develop' - # 检出依赖的xengine仓库到指定的xengine目录 - name: Checkout dependency repository (xengine) uses: actions/checkout@v4 with: @@ -42,18 +52,17 @@ jobs: run: | dnf update -y dnf install gcc g++ make git jq unzip -y - # 设置依赖库的环境变量 - name: Set up Dependency rocky linux Environment run: | cd libxengine chmod 777 * ./XEngine_LINEnv.sh -i 0 - name: install xengine library - run: | + run: | latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) - wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_RockyLinux_9_x86-64.zip - unzip ./XEngine_RockyLinux_9_x86-64.zip -d ./XEngine_RockyLinux_9_x86-64 - cd XEngine_RockyLinux_9_x86-64 + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_RockyLinux_9_${{ matrix.artifact }}.zip + unzip ./XEngine_RockyLinux_9_${{ matrix.artifact }}.zip -d ./XEngine_RockyLinux_9_${{ matrix.artifact }} + cd XEngine_RockyLinux_9_${{ matrix.artifact }} cp -rf ./XEngine_Include /usr/local/include find ./XEngine_Linux -name "*.so" -exec cp {} /usr/lib64 \; @@ -78,6 +87,6 @@ jobs: - name: Upload folder as artifact with RockyLinux uses: actions/upload-artifact@v4 with: - name: XEngine_MQServiceApp-RockyLinux_9_x86_64 + name: XEngine_MQServiceApp-RockyLinux_9_${{ matrix.artifact }} path: XEngine_Release/ retention-days: 1 diff --git a/.github/workflows/UbuntuArm64_build.yml b/.github/workflows/UbuntuArm64_build.yml deleted file mode 100644 index bc4cb38..0000000 --- a/.github/workflows/UbuntuArm64_build.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: ubuntu Arm64 build workflows - -on: - push: - branches: - - 'develop' - paths: - - 'XEngine_Source/**' - - 'XEngine_Release/**' - - '.github/**' - -jobs: - build: - runs-on: ubuntu-24.04 - env: - IMAGE_NAME: ubuntu:24.04 - - strategy: - fail-fast: false - matrix: - arch: [linux/arm64] - - steps: - - name: Checkout main repository code - uses: actions/checkout@v4 - with: - ref: 'develop' - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Build ${{ matrix.arch }} - run: | - docker run --platform ${{ matrix.arch }} --rm \ - -v ${{ github.workspace }}:/workspace \ - -w /workspace ${{ env.IMAGE_NAME }} /bin/sh -c ' - set -e - apt update -y - apt install git make g++ wget curl jq unzip -y - - git config --global --add safe.directory /workspace - git submodule init - git submodule update - - latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) - wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_24.04_Arm64.zip - unzip ./XEngine_UBuntu_24.04_Arm64.zip -d ./XEngine_UBuntu_24.04_Arm64 - cd XEngine_UBuntu_24.04_Arm64 - - chmod 777 ./XEngine_LINEnv.sh - ./XEngine_LINEnv.sh -i 0 - - cp -rf ./XEngine_Include /usr/local/include - find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; - ldconfig - cd .. - - cd XEngine_Source - make ARCH=Arm64 RELEASE=1 - make FLAGS=InstallAll - make FLAGS=CleanAll - cd .. - - cd XEngine_Release - ./XEngine_MQServiceApp -t - chown -R $(id -u):$(id -g) . - chmod -R a+r . ' - - - name: Upload folder as artifact with ubuntu Arm64 - uses: actions/upload-artifact@v4 - with: - name: XEngine_MQServiceApp-Ubuntu_24.04_Arm64 - path: XEngine_Release/ - retention-days: 1 \ No newline at end of file diff --git a/.github/workflows/UbuntuX86_64_build.yml b/.github/workflows/UbuntuX86_64_build.yml deleted file mode 100644 index 9bbe8e1..0000000 --- a/.github/workflows/UbuntuX86_64_build.yml +++ /dev/null @@ -1,90 +0,0 @@ -name: ubuntu x86_64 build workflows - -on: - push: - branches: - - 'develop' - paths: - - 'XEngine_Source/**' - - 'XEngine_Release/**' - - '.github/**' - -jobs: - build: - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-22.04 - - os: ubuntu-24.04 - runs-on: ${{ matrix.os }} - - steps: - - name: Checkout main repository code - uses: actions/checkout@v4 - with: - ref: 'develop' - - - name: Checkout dependency repository (xengine) - uses: actions/checkout@v4 - with: - repository: libxengine/libxengine - path: libxengine - - - name: sub module checkout (opensource) - run: | - git submodule init - git submodule update - - - name: Set up Dependency ubuntu24.04 Environment - if: matrix.os == 'ubuntu-24.04' - run: | - cd libxengine - chmod 777 * - sudo ./XEngine_LINEnv.sh -i 3 - - name: Set up Dependency ubuntu22.04 Environment - if: matrix.os == 'ubuntu-22.04' - run: | - cd libxengine - chmod 777 * - sudo ./XEngine_LINEnv.sh -i 0 - - latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) - wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_22.04_x86-64.zip - unzip ./XEngine_UBuntu_22.04_x86-64.zip -d ./XEngine_UBuntu_22.04_x86-64 - cd XEngine_UBuntu_22.04_x86-64 - - sudo cp -rf ./XEngine_Include /usr/local/include - sudo find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; - sudo ldconfig - - - name: make - run: | - cd XEngine_Source - make - make FLAGS=InstallAll - make FLAGS=CleanAll - - make RELEASE=1 - make FLAGS=InstallAll - make FLAGS=CleanAll - cd .. - - name: test - run: | - cd XEngine_Release - ./XEngine_MQServiceApp -t - - - name: Upload folder as artifact with ubuntu22.04 - if: matrix.os == 'ubuntu-22.04' - uses: actions/upload-artifact@v4 - with: - name: XEngine_MQServiceApp-Ubuntu_22.04_x86_64 - path: XEngine_Release/ - retention-days: 1 - - name: Upload folder as artifact with ubuntu24.04 - if: matrix.os == 'ubuntu-24.04' - uses: actions/upload-artifact@v4 - with: - name: XEngine_MQServiceApp-Ubuntu_24.04_x86_64 - path: XEngine_Release/ - retention-days: 1 \ No newline at end of file diff --git a/.github/workflows/Ubuntu_build.yml b/.github/workflows/Ubuntu_build.yml new file mode 100644 index 0000000..088d729 --- /dev/null +++ b/.github/workflows/Ubuntu_build.yml @@ -0,0 +1,136 @@ +name: ubuntu build workflows + +on: + push: + branches: + - 'develop' + paths: + - 'XEngine_Source/**' + - 'XEngine_Release/**' + - '.github/**' + +jobs: + build: + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-22.04 + - os: ubuntu-24.04 + - os: ubuntu-22.04-arm + - os: ubuntu-24.04-arm + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout main repository code + uses: actions/checkout@v4 + with: + ref: 'develop' + + - name: Checkout dependency repository (xengine) + uses: actions/checkout@v4 + with: + repository: libxengine/libxengine + path: libxengine + + - name: sub module checkout (opensource) + run: | + git submodule init + git submodule update + + - name: Set up Dependency ubuntu24.04 x86-64 Environment + if: matrix.os == 'ubuntu-24.04' + run: | + cd libxengine + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 3 + - name: Set up Dependency ubuntu22.04 x86-64 Environment + if: matrix.os == 'ubuntu-22.04' + run: | + cd libxengine + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 0 + + latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_22.04_x86-64.zip + unzip ./XEngine_UBuntu_22.04_x86-64.zip -d ./XEngine_UBuntu_22.04_x86-64 + cd XEngine_UBuntu_22.04_x86-64 + + sudo cp -rf ./XEngine_Include /usr/local/include + sudo find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; + sudo ldconfig + - name: Set up Dependency ubuntu22.04 arm Environment + if: matrix.os == 'ubuntu-22.04-arm' + run: | + cd libxengine + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 0 + + latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_22.04_Arm64.zip + unzip .XEngine_UBuntu_22.04_Arm64.zip -d ./XEngine_UBuntu_22.04_Arm64 + cd XEngine_UBuntu_22.04_Arm64 + + sudo cp -rf ./XEngine_Include /usr/local/include + sudo find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; + sudo ldconfig + - name: Set up Dependency ubuntu24.04 arm Environment + if: matrix.os == 'ubuntu-24.04-arm' + run: | + cd libxengine + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 0 + + latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_24.04_Arm64.zip + unzip .XEngine_UBuntu_24.04_Arm64.zip -d ./XEngine_UBuntu_24.04_Arm64 + cd XEngine_UBuntu_24.04_Arm64 + + sudo cp -rf ./XEngine_Include /usr/local/include + sudo find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; + sudo ldconfig + + - name: make + run: | + cd XEngine_Source + make + make FLAGS=InstallAll + make FLAGS=CleanAll + + make RELEASE=1 + make FLAGS=InstallAll + make FLAGS=CleanAll + cd .. + - name: test + run: | + cd XEngine_Release + ./XEngine_MQServiceApp -t + + - name: Upload folder as artifact with ubuntu22.04 x86-64 + if: matrix.os == 'ubuntu-22.04' + uses: actions/upload-artifact@v4 + with: + name: XEngine_MQServiceApp-Ubuntu_22.04_x86_64 + path: XEngine_Release/ + retention-days: 1 + - name: Upload folder as artifact with ubuntu24.04 x86-64 + if: matrix.os == 'ubuntu-24.04' + uses: actions/upload-artifact@v4 + with: + name: XEngine_MQServiceApp-Ubuntu_24.04_x86_64 + path: XEngine_Release/ + retention-days: 1 + - name: Upload folder as artifact with ubuntu22.04 Arm64 + if: matrix.os == 'ubuntu-22.04-arm' + uses: actions/upload-artifact@v4 + with: + name: XEngine_MQServiceApp-Ubuntu_22.04_Arm64 + path: XEngine_Release/ + retention-days: 1 + - name: Upload folder as artifact with ubuntu24.04 Arm64 + if: matrix.os == 'ubuntu-24.04-arm' + uses: actions/upload-artifact@v4 + with: + name: XEngine_MQServiceApp-Ubuntu_24.04_Arm64 + path: XEngine_Release/ + retention-days: 1 \ No newline at end of file diff --git a/.github/workflows/debian_build.yml b/.github/workflows/debian_build.yml new file mode 100644 index 0000000..7e9a6d3 --- /dev/null +++ b/.github/workflows/debian_build.yml @@ -0,0 +1,87 @@ +name: debian build workflows + +on: + push: + branches: + - 'develop' + paths: + - 'XEngine_Source/**' + - 'XEngine_Release/**' + - '.github/**' + +permissions: + contents: read + +jobs: + build: + runs-on: ${{ matrix.runner }} + container: + image: debian:bookworm + options: --platform ${{ matrix.platform }} + strategy: + matrix: + include: + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + artifact: x86-64 + + steps: + - name: Checkout main repository code + uses: actions/checkout@v4 + + - name: Checkout dependency repository (xengine) + uses: actions/checkout@v4 + with: + repository: libxengine/libxengine + path: libxengine + + - name: sub module checkout (opensource) + uses: actions/checkout@v4 + with: + repository: libxengine/XEngine_OPenSource + path: XEngine_Source/XEngine_Depend + + - name: install system package + run: | + apt update -y + apt install gcc g++ make git jq unzip curl -y + + - name: Set up Dependency rocky linux Environment + run: | + cd libxengine + chmod 777 * + ./XEngine_LINEnv.sh -i 0 + - name: install xengine library + run: | + latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_Debian_12_${{ matrix.artifact }}.zip + unzip ./XEngine_Debian_12_${{ matrix.artifact }}.zip -d ./XEngine_Debian_12_${{ matrix.artifact }} + cd XEngine_Debian_12_${{ matrix.artifact }} + + cp -rf ./XEngine_Include /usr/local/include + find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; + ldconfig + + - name: make + run: | + cd XEngine_Source + make + make FLAGS=InstallAll + make FLAGS=CleanAll + + make RELEASE=1 + make FLAGS=InstallAll + make FLAGS=CleanAll + cd .. + - name: test + run: | + cd XEngine_Release + ./XEngine_MQServiceApp -t + + - name: Upload folder as artifact + uses: actions/upload-artifact@v4 + with: + name: XEngine_MQServiceApp-Debian_12_x86-64 + path: XEngine_Release/ + retention-days: 1 \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1b3fb91..c26ef01 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,37 +16,28 @@ jobs: with: fetch-depth: 0 - - name: Download ubuntubuild x86_64 + - name: Download ubuntu build uses: dawidd6/action-download-artifact@v6 with: - workflow: UbuntuX86_64_build.yml + workflow: Ubuntu_build.yml workflow_conclusion: success check_artifacts: false skip_unpack: true if_no_artifact_found: fail path: ./XRelease/ - - name: Download ubuntubuild Arm64 + - name: Download debian build uses: dawidd6/action-download-artifact@v6 with: - workflow: UbuntuArm64_build.yml + workflow: debian_build.yml workflow_conclusion: success check_artifacts: false skip_unpack: true if_no_artifact_found: fail path: ./XRelease/ - - name: Download Rockylinux Arm64 + - name: Download Rockylinux uses: dawidd6/action-download-artifact@v6 with: - workflow: RockyArm64_build.yml - workflow_conclusion: success - check_artifacts: false - skip_unpack: true - if_no_artifact_found: fail - path: ./XRelease/ - - name: Download Rockylinux x86_64 - uses: dawidd6/action-download-artifact@v6 - with: - workflow: RockyX86_64_build.yml + workflow: Rocky_build.yml workflow_conclusion: success check_artifacts: false skip_unpack: true From 0185f93c25cf2a6e7a38eb36f580a5d895cf07c5 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 10 May 2025 13:26:50 +0800 Subject: [PATCH 03/28] ci:fixed ubuntu build --- .github/workflows/Ubuntu_build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Ubuntu_build.yml b/.github/workflows/Ubuntu_build.yml index 088d729..e587335 100644 --- a/.github/workflows/Ubuntu_build.yml +++ b/.github/workflows/Ubuntu_build.yml @@ -68,7 +68,7 @@ jobs: latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_22.04_Arm64.zip - unzip .XEngine_UBuntu_22.04_Arm64.zip -d ./XEngine_UBuntu_22.04_Arm64 + unzip ./XEngine_UBuntu_22.04_Arm64.zip -d ./XEngine_UBuntu_22.04_Arm64 cd XEngine_UBuntu_22.04_Arm64 sudo cp -rf ./XEngine_Include /usr/local/include @@ -83,7 +83,7 @@ jobs: latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_24.04_Arm64.zip - unzip .XEngine_UBuntu_24.04_Arm64.zip -d ./XEngine_UBuntu_24.04_Arm64 + unzip ./XEngine_UBuntu_24.04_Arm64.zip -d ./XEngine_UBuntu_24.04_Arm64 cd XEngine_UBuntu_24.04_Arm64 sudo cp -rf ./XEngine_Include /usr/local/include From 0c09f442bc8ab46ae6a8fd99367488a1d72975de Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 10 May 2025 13:52:40 +0800 Subject: [PATCH 04/28] ci:add term var --- .github/workflows/Rocky_build.yml | 6 +++++- .github/workflows/Ubuntu_build.yml | 3 +++ .github/workflows/debian_build.yml | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Rocky_build.yml b/.github/workflows/Rocky_build.yml index 6258bd6..e462e63 100644 --- a/.github/workflows/Rocky_build.yml +++ b/.github/workflows/Rocky_build.yml @@ -47,11 +47,15 @@ jobs: with: repository: libxengine/XEngine_OPenSource path: XEngine_Source/XEngine_Depend - + + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: install system package run: | dnf update -y dnf install gcc g++ make git jq unzip -y + - name: Set up Dependency rocky linux Environment run: | cd libxengine diff --git a/.github/workflows/Ubuntu_build.yml b/.github/workflows/Ubuntu_build.yml index e587335..6e51d6d 100644 --- a/.github/workflows/Ubuntu_build.yml +++ b/.github/workflows/Ubuntu_build.yml @@ -38,6 +38,9 @@ jobs: git submodule init git submodule update + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: Set up Dependency ubuntu24.04 x86-64 Environment if: matrix.os == 'ubuntu-24.04' run: | diff --git a/.github/workflows/debian_build.yml b/.github/workflows/debian_build.yml index 7e9a6d3..51a7eb8 100644 --- a/.github/workflows/debian_build.yml +++ b/.github/workflows/debian_build.yml @@ -42,6 +42,9 @@ jobs: repository: libxengine/XEngine_OPenSource path: XEngine_Source/XEngine_Depend + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: install system package run: | apt update -y From f2d1f55d6ca198563db381b668ae5ddeeedcadb5 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 13 May 2025 10:47:54 +0800 Subject: [PATCH 05/28] update:make file build flags --- .github/workflows/macbuild.yml | 3 ++ XEngine_Source/MQCore_ConfigModule/Makefile | 24 ++++++------- XEngine_Source/MQCore_DBModule/Makefile | 26 +++++++------- XEngine_Source/MQCore_HelpModule/Makefile | 24 ++++++------- XEngine_Source/MQCore_MemoryCache/Makefile | 26 +++++++------- XEngine_Source/MQCore_ProtocolModule/Makefile | 26 +++++++------- XEngine_Source/MQCore_SessionModule/Makefile | 24 ++++++------- XEngine_Source/Makefile | 14 ++++---- XEngine_Source/XEngine_MQServiceApp/Makefile | 36 +++++++++---------- 9 files changed, 102 insertions(+), 101 deletions(-) diff --git a/.github/workflows/macbuild.yml b/.github/workflows/macbuild.yml index e3edb2d..a10fa5a 100644 --- a/.github/workflows/macbuild.yml +++ b/.github/workflows/macbuild.yml @@ -35,6 +35,9 @@ jobs: git submodule init git submodule update + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: brew install run: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" diff --git a/XEngine_Source/MQCore_ConfigModule/Makefile b/XEngine_Source/MQCore_ConfigModule/Makefile index e6ecf33..62da2d6 100644 --- a/XEngine_Source/MQCore_ConfigModule/Makefile +++ b/XEngine_Source/MQCore_ConfigModule/Makefile @@ -1,10 +1,7 @@ CC = g++ -Wall -std=c++20 -fPIC -PLATFORM = linux PLATVER = -PLATDIR = FILEEXT = LIBFLAG = -RELEASE = 0 LOADHDR = -I ./ -I ../XEngine_Depend/XEngine_Module/jsoncpp LOADSO = -L ../XEngine_Depend/XEngine_Module/jsoncpp LIB = -ljsoncpp @@ -12,25 +9,29 @@ LIBEX = OBJECTS = Config_Json.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif +ifeq ($(UNICODE),1) +override UNICODE := -D __UNICODE__ +else +override UNICODE := -D __ANSI__ +endif + ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif FILEEXT = so LIBFLAG = -shared @@ -39,7 +40,6 @@ ifeq ($(PLATFORM),linux) else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac FILEEXT = dylib LIBFLAG = -dynamiclib LIBEX = -lpthread -ldl @@ -51,10 +51,10 @@ all:$(OBJECTS) $(CC) $(DEBUG) $(OBJECTS) -o libMQCore_ConfigModule.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) Config_Json.o:./Config_Json/Config_Json.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./Config_Json/Config_Json.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./Config_Json/Config_Json.cpp pch.o:./pch.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./pch.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp InstallAll:InstallSo diff --git a/XEngine_Source/MQCore_DBModule/Makefile b/XEngine_Source/MQCore_DBModule/Makefile index 1c3d89f..91d7445 100644 --- a/XEngine_Source/MQCore_DBModule/Makefile +++ b/XEngine_Source/MQCore_DBModule/Makefile @@ -1,10 +1,7 @@ CC = g++ -Wall -std=c++20 -fPIC -PLATFORM = linux PLATVER = -PLATDIR = FILEEXT = LIBFLAG = -RELEASE = 0 LOADHDR = -I ./ LOADSO = -L ../MQCore_MemoryCache LIB = -lXEngine_BaseLib -lHelpComponents_DataBase -lMQCore_MemoryCache @@ -12,25 +9,29 @@ LIBEX = OBJECTS = DBModule_MQData.o DBModule_MQUser.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif +ifeq ($(UNICODE),1) +override UNICODE := -D __UNICODE__ +else +override UNICODE := -D __ANSI__ +endif + ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif FILEEXT = so LIBFLAG = -shared @@ -39,7 +40,6 @@ ifeq ($(PLATFORM),linux) else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac FILEEXT = dylib LIBFLAG = -dynamiclib LIBEX = -lpthread -ldl @@ -51,12 +51,12 @@ all:$(OBJECTS) $(CC) $(DEBUG) $(OBJECTS) -o libMQCore_DBModule.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) DBModule_MQData.o:./DBModule_MQData/DBModule_MQData.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./DBModule_MQData/DBModule_MQData.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./DBModule_MQData/DBModule_MQData.cpp DBModule_MQUser.o:./DBModule_MQUser/DBModule_MQUser.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./DBModule_MQUser/DBModule_MQUser.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./DBModule_MQUser/DBModule_MQUser.cpp pch.o:./pch.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./pch.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp InstallAll:InstallSo diff --git a/XEngine_Source/MQCore_HelpModule/Makefile b/XEngine_Source/MQCore_HelpModule/Makefile index a2935b6..7da10c4 100644 --- a/XEngine_Source/MQCore_HelpModule/Makefile +++ b/XEngine_Source/MQCore_HelpModule/Makefile @@ -1,10 +1,7 @@ CC = g++ -Wall -std=c++20 -fPIC -PLATFORM = linux PLATVER = -PLATDIR = FILEEXT = LIBFLAG = -RELEASE = 0 LOADHDR = -I ./ LOADSO = LIB = @@ -12,25 +9,29 @@ LIBEX = OBJECTS = APIHelp_Counter.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif +ifeq ($(UNICODE),1) +override UNICODE := -D __UNICODE__ +else +override UNICODE := -D __ANSI__ +endif + ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif FILEEXT = so LIBFLAG = -shared @@ -39,7 +40,6 @@ ifeq ($(PLATFORM),linux) else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac FILEEXT = dylib LIBFLAG = -dynamiclib LIBEX = -lpthread -ldl @@ -51,10 +51,10 @@ all:$(OBJECTS) $(CC) $(DEBUG) $(OBJECTS) -o libMQCore_HelpModule.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) APIHelp_Counter.o:./APIHelp_Counter/APIHelp_Counter.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./APIHelp_Counter/APIHelp_Counter.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./APIHelp_Counter/APIHelp_Counter.cpp pch.o:./pch.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./pch.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp InstallAll:InstallSo diff --git a/XEngine_Source/MQCore_MemoryCache/Makefile b/XEngine_Source/MQCore_MemoryCache/Makefile index 0bf5aa7..e19062f 100644 --- a/XEngine_Source/MQCore_MemoryCache/Makefile +++ b/XEngine_Source/MQCore_MemoryCache/Makefile @@ -1,10 +1,7 @@ CC = g++ -Wall -std=c++20 -fPIC -PLATFORM = linux PLATVER = -PLATDIR = FILEEXT = LIBFLAG = -RELEASE = 0 LOADHDR = -I ./ LOADSO = LIB = -lHelpComponents_DataBase @@ -12,25 +9,29 @@ LIBEX = OBJECTS = MemoryCache_DBData.o MemoryCache_DBUser.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif +ifeq ($(UNICODE),1) +override UNICODE := -D __UNICODE__ +else +override UNICODE := -D __ANSI__ +endif + ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif FILEEXT = so LIBFLAG = -shared @@ -39,7 +40,6 @@ ifeq ($(PLATFORM),linux) else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac FILEEXT = dylib LIBFLAG = -dynamiclib LIBEX = -lpthread -ldl @@ -51,12 +51,12 @@ all:$(OBJECTS) $(CC) $(DEBUG) $(OBJECTS) -o libMQCore_MemoryCache.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) MemoryCache_DBData.o:./MemoryCache_DBData/MemoryCache_DBData.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./MemoryCache_DBData/MemoryCache_DBData.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MemoryCache_DBData/MemoryCache_DBData.cpp MemoryCache_DBUser.o:./MemoryCache_DBUser/MemoryCache_DBUser.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./MemoryCache_DBUser/MemoryCache_DBUser.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MemoryCache_DBUser/MemoryCache_DBUser.cpp pch.o:./pch.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./pch.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp InstallAll:InstallSo diff --git a/XEngine_Source/MQCore_ProtocolModule/Makefile b/XEngine_Source/MQCore_ProtocolModule/Makefile index da415a8..e7ffeba 100644 --- a/XEngine_Source/MQCore_ProtocolModule/Makefile +++ b/XEngine_Source/MQCore_ProtocolModule/Makefile @@ -1,10 +1,7 @@ CC = g++ -Wall -std=c++20 -fPIC -PLATFORM = linux PLATVER = -PLATDIR = FILEEXT = LIBFLAG = -RELEASE = 0 LOADHDR = -I ./ -I ../XEngine_Depend/XEngine_Module/jsoncpp LOADSO = -L ../XEngine_Depend/XEngine_Module/jsoncpp LIB = -ljsoncpp -lXEngine_BaseLib -lXEngine_Cryption -lRfcComponents_MQTTProtocol @@ -12,25 +9,29 @@ LIBEX = OBJECTS = ProtocolModule_Packet.o ProtocolModule_Parse.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif +ifeq ($(UNICODE),1) +override UNICODE := -D __UNICODE__ +else +override UNICODE := -D __ANSI__ +endif + ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif FILEEXT = so LIBFLAG = -shared @@ -39,7 +40,6 @@ ifeq ($(PLATFORM),linux) else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac FILEEXT = dylib LIBFLAG = -dynamiclib LIBEX = -lpthread -ldl @@ -51,12 +51,12 @@ all:$(OBJECTS) $(CC) $(DEBUG) $(OBJECTS) -o libMQCore_ProtocolModule.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) ProtocolModule_Packet.o:./ProtocolModule_Packet/ProtocolModule_Packet.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./ProtocolModule_Packet/ProtocolModule_Packet.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ProtocolModule_Packet/ProtocolModule_Packet.cpp ProtocolModule_Parse.o:./ProtocolModule_Parse/ProtocolModule_Parse.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./ProtocolModule_Parse/ProtocolModule_Parse.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ProtocolModule_Parse/ProtocolModule_Parse.cpp pch.o:./pch.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./pch.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp InstallAll:InstallSo diff --git a/XEngine_Source/MQCore_SessionModule/Makefile b/XEngine_Source/MQCore_SessionModule/Makefile index afdd9b7..4001586 100644 --- a/XEngine_Source/MQCore_SessionModule/Makefile +++ b/XEngine_Source/MQCore_SessionModule/Makefile @@ -1,10 +1,6 @@ CC = g++ -Wall -std=c++20 -fPIC -PLATFORM = linux -PLATVER = -PLATDIR = FILEEXT = LIBFLAG = -RELEASE = 0 LOADHDR = -I ./ LOADSO = LIB = -lXEngine_BaseLib @@ -12,26 +8,29 @@ LIBEX = OBJECTS = SessionModule_Client.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif +ifeq ($(UNICODE),1) +override UNICODE := -D __UNICODE__ +else +override UNICODE := -D __ANSI__ +endif ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif FILEEXT = so LIBFLAG = -shared @@ -40,7 +39,6 @@ ifeq ($(PLATFORM),linux) else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac FILEEXT = dylib LIBFLAG = -dynamiclib LIBEX = -lpthread -ldl @@ -52,10 +50,10 @@ all:$(OBJECTS) $(CC) $(DEBUG) $(OBJECTS) -o libMQCore_SessionModule.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) SessionModule_Client.o:./SessionModule_Client/SessionModule_Client.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./SessionModule_Client/SessionModule_Client.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./SessionModule_Client/SessionModule_Client.cpp pch.o:./pch.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./pch.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp InstallAll:InstallSo diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index 41a88ae..36e086e 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -43,17 +43,17 @@ else endif libMQCore_ConfigModule.so: - make -C $(BASE_CONFIG_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_CONFIG_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) libMQCore_ProtocolModule.so: - make -C $(BASE_PROTOCOL_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_PROTOCOL_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) libMQCore_SessionModule.so: - make -C $(BASE_SESSION_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_SESSION_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) libMQCore_MemoryCache.so: - make -C $(BASE_MEMORYCACHE_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_MEMORYCACHE_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) libMQCore_DBModule.so: - make -C $(BASE_DATABASE_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_DATABASE_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) libMQCore_HelpModule.so: - make -C $(BASE_HELP_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_HELP_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) XEngine_MQServiceApp.exe: - make -C $(APP_SERVICE_PATH) PLATFORM=$(PLATFORM) $(FLAGS) \ No newline at end of file + make -C $(APP_SERVICE_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/Makefile b/XEngine_Source/XEngine_MQServiceApp/Makefile index 62bd490..417bb54 100644 --- a/XEngine_Source/XEngine_MQServiceApp/Makefile +++ b/XEngine_Source/XEngine_MQServiceApp/Makefile @@ -1,8 +1,5 @@ CC = g++ -Wall -std=c++20 -PLATFORM = linux PLATVER = -PLATDIR = -RELEASE = 0 LOADHDR = -I ./ LOADSO = -L ../MQCore_ConfigModule -L ../MQCore_ProtocolModule -L ../MQCore_SessionModule -L ../MQCore_MemoryCache -L ../MQCore_DBModule -L ../MQCore_HelpModule \ -L ../XEngine_Depend/XEngine_Module/jsoncpp -L ../XEngine_Depend/XEngine_Module/XEngine_InfoReport @@ -13,32 +10,35 @@ LIBEX = OBJECTS = MQService_Net.o MQService_Config.o MQService_TCPTask.o MQService_HttpTask.o MQService_WSTask.o MQService_Task.o MQService_MQTTTask.o XEngine_MQServiceApp.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif +ifeq ($(UNICODE),1) +override UNICODE := -D __UNICODE__ +else +override UNICODE := -D __ANSI__ +endif + ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif LIBEX = -lpthread -lrt -ldl LOADBIN = -Wl,-rpath=./,--disable-new-dtags else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac LIBEX = -lpthread -ldl LOADBIN = -Wl,-rpath,@loader_path/./ endif @@ -47,22 +47,22 @@ all:$(OBJECTS) $(CC) $(DEBUG) $(OBJECTS) -o XEngine_MQServiceApp $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) MQService_Net.o:./MQService_Net.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./MQService_Net.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MQService_Net.cpp MQService_Config.o:./MQService_Config.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./MQService_Config.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MQService_Config.cpp MQService_TCPTask.o:./MQService_TCPTask.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./MQService_TCPTask.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MQService_TCPTask.cpp MQService_HttpTask.o:./MQService_HttpTask.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./MQService_HttpTask.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MQService_HttpTask.cpp MQService_WSTask.o:./MQService_WSTask.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./MQService_WSTask.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MQService_WSTask.cpp MQService_Task.o:./MQService_Task.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./MQService_Task.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MQService_Task.cpp MQService_MQTTTask.o:./MQService_MQTTTask.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./MQService_MQTTTask.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MQService_MQTTTask.cpp XEngine_MQServiceApp.o:./XEngine_MQServiceApp.cpp - $(CC) $(DEBUG) $(FLAGS) $(PLATVER) $(LOADHDR) ./XEngine_MQServiceApp.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_MQServiceApp.cpp InstallAll:InstallApp From f2cc3eb0a473d24437593e7b682b421498794f83 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 13 May 2025 13:56:17 +0800 Subject: [PATCH 06/28] modify:only release work for report info and improved get time function --- .../XEngine_MQServiceApp.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp index e5dcd2a..fdfed94 100644 --- a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp @@ -390,20 +390,14 @@ int main(int argc, char** argv) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,MQTT消息服务没有被启用")); } +#ifndef _DEBUG //发送信息报告 if (st_ServiceCfg.st_XReport.bEnable && !bIsTest) { - if (InfoReport_APIMachine_Send(st_ServiceCfg.st_XReport.tszAPIUrl, st_ServiceCfg.st_XReport.tszServiceName)) + __int64x nTimeCount = 0; + if (InfoReport_APIMachine_Send(st_ServiceCfg.st_XReport.tszAPIUrl, st_ServiceCfg.st_XReport.tszServiceName, &nTimeCount)) { - __int64x nTimeCount = 0; - if (InfoReport_APIMachine_GetTime(st_ServiceCfg.st_XReport.tszAPIUrl, st_ServiceCfg.st_XReport.tszServiceName, &nTimeCount)) - { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动信息报告给API服务器:%s 成功,报告次数:%lld"), st_ServiceCfg.st_XReport.tszAPIUrl, nTimeCount); - } - else - { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动信息报告给API服务器:%s 成功,获取报告次数失败,错误:%lX"), st_ServiceCfg.st_XReport.tszAPIUrl, InfoReport_GetLastError()); - } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动信息报告给API服务器:%s 成功,报告次数:%lld"), st_ServiceCfg.st_XReport.tszAPIUrl, nTimeCount); } else { @@ -414,7 +408,7 @@ int main(int argc, char** argv) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,信息报告给API服务器没有启用")); } - +#endif XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("所有服务成功启动,服务运行中,XEngine版本:%s%s,发行版本次数:%d,当前运行版本:%s。。。"), BaseLib_Version_XNumberStr(), BaseLib_Version_XTypeStr(), st_ServiceCfg.st_XVer.pStl_ListStorage->size(), st_ServiceCfg.st_XVer.pStl_ListStorage->front().c_str()); while (true) From b76c59ae9ff103612734979e966a810bb8ededed Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 19 May 2025 11:26:20 +0800 Subject: [PATCH 07/28] ci:update build --- .github/workflows/Rocky_build.yml | 12 +--- .github/workflows/Ubuntu_build.yml | 27 ++------- .github/workflows/debian_build.yml | 12 +--- .github/workflows/fedora_build.yml | 89 ++++++++++++++++++++++++++++++ .github/workflows/macbuild.yml | 11 +--- 5 files changed, 103 insertions(+), 48 deletions(-) create mode 100644 .github/workflows/fedora_build.yml diff --git a/.github/workflows/Rocky_build.yml b/.github/workflows/Rocky_build.yml index e462e63..d3350e7 100644 --- a/.github/workflows/Rocky_build.yml +++ b/.github/workflows/Rocky_build.yml @@ -54,13 +54,8 @@ jobs: - name: install system package run: | dnf update -y - dnf install gcc g++ make git jq unzip -y + dnf install gcc g++ make git jq unzip wget -y - - name: Set up Dependency rocky linux Environment - run: | - cd libxengine - chmod 777 * - ./XEngine_LINEnv.sh -i 0 - name: install xengine library run: | latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) @@ -68,9 +63,8 @@ jobs: unzip ./XEngine_RockyLinux_9_${{ matrix.artifact }}.zip -d ./XEngine_RockyLinux_9_${{ matrix.artifact }} cd XEngine_RockyLinux_9_${{ matrix.artifact }} - cp -rf ./XEngine_Include /usr/local/include - find ./XEngine_Linux -name "*.so" -exec cp {} /usr/lib64 \; - ldconfig + chmod 777 * + ./XEngine_LINEnv.sh -i 3 - name: make run: | diff --git a/.github/workflows/Ubuntu_build.yml b/.github/workflows/Ubuntu_build.yml index 6e51d6d..6138309 100644 --- a/.github/workflows/Ubuntu_build.yml +++ b/.github/workflows/Ubuntu_build.yml @@ -50,48 +50,33 @@ jobs: - name: Set up Dependency ubuntu22.04 x86-64 Environment if: matrix.os == 'ubuntu-22.04' run: | - cd libxengine - chmod 777 * - sudo ./XEngine_LINEnv.sh -i 0 - latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_22.04_x86-64.zip unzip ./XEngine_UBuntu_22.04_x86-64.zip -d ./XEngine_UBuntu_22.04_x86-64 cd XEngine_UBuntu_22.04_x86-64 - sudo cp -rf ./XEngine_Include /usr/local/include - sudo find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; - sudo ldconfig + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 3 - name: Set up Dependency ubuntu22.04 arm Environment if: matrix.os == 'ubuntu-22.04-arm' run: | - cd libxengine - chmod 777 * - sudo ./XEngine_LINEnv.sh -i 0 - latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_22.04_Arm64.zip unzip ./XEngine_UBuntu_22.04_Arm64.zip -d ./XEngine_UBuntu_22.04_Arm64 cd XEngine_UBuntu_22.04_Arm64 - sudo cp -rf ./XEngine_Include /usr/local/include - sudo find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; - sudo ldconfig + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 3 - name: Set up Dependency ubuntu24.04 arm Environment if: matrix.os == 'ubuntu-24.04-arm' run: | - cd libxengine - chmod 777 * - sudo ./XEngine_LINEnv.sh -i 0 - latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_24.04_Arm64.zip unzip ./XEngine_UBuntu_24.04_Arm64.zip -d ./XEngine_UBuntu_24.04_Arm64 cd XEngine_UBuntu_24.04_Arm64 - sudo cp -rf ./XEngine_Include /usr/local/include - sudo find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; - sudo ldconfig + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 3 - name: make run: | diff --git a/.github/workflows/debian_build.yml b/.github/workflows/debian_build.yml index 51a7eb8..1781146 100644 --- a/.github/workflows/debian_build.yml +++ b/.github/workflows/debian_build.yml @@ -48,13 +48,8 @@ jobs: - name: install system package run: | apt update -y - apt install gcc g++ make git jq unzip curl -y + apt install gcc g++ make git jq unzip curl wget -y - - name: Set up Dependency rocky linux Environment - run: | - cd libxengine - chmod 777 * - ./XEngine_LINEnv.sh -i 0 - name: install xengine library run: | latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) @@ -62,9 +57,8 @@ jobs: unzip ./XEngine_Debian_12_${{ matrix.artifact }}.zip -d ./XEngine_Debian_12_${{ matrix.artifact }} cd XEngine_Debian_12_${{ matrix.artifact }} - cp -rf ./XEngine_Include /usr/local/include - find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; - ldconfig + chmod 777 * + ./XEngine_LINEnv.sh -i 3 - name: make run: | diff --git a/.github/workflows/fedora_build.yml b/.github/workflows/fedora_build.yml new file mode 100644 index 0000000..93dfc85 --- /dev/null +++ b/.github/workflows/fedora_build.yml @@ -0,0 +1,89 @@ +name: fedora build workflows + +on: + push: + branches: + - 'develop' + paths: + - 'XEngine_Source/**' + - 'XEngine_Release/**' + - '.github/**' + +permissions: + contents: read + +jobs: + build: + runs-on: ${{ matrix.runner }} + container: + image: fedora:${{ matrix.fedora-version }} + options: --platform ${{ matrix.platform }} + strategy: + matrix: + include: + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + fedora-version: 42 + artifact: x86-64 + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + fedora-version: 41 + artifact: x86-64 + + steps: + - name: Checkout main repository code + uses: actions/checkout@v4 + + - name: Checkout dependency repository (xengine) + uses: actions/checkout@v4 + with: + repository: libxengine/libxengine + path: libxengine + + - name: sub module checkout (opensource) + uses: actions/checkout@v4 + with: + repository: libxengine/XEngine_OPenSource + path: XEngine_Source/XEngine_Depend + + - name: install system package + run: | + dnf update -y + dnf install gcc g++ make git jq unzip wget -y + + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + + - name: install xengine library + run: | + latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }}.zip + unzip ./XEngine_Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }}.zip -d ./XEngine_Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }} + cd XEngine_Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }} + + chmod 777 * + ./XEngine_LINEnv.sh -i 3 + - name: make + run: | + cd XEngine_Source + make + make FLAGS=InstallAll + make FLAGS=CleanAll + + make RELEASE=1 + make FLAGS=InstallAll + make FLAGS=CleanAll + cd .. + - name: test + run: | + cd XEngine_Release + ./XEngine_MQServiceApp -t + + - name: Upload folder as artifact + uses: actions/upload-artifact@v4 + with: + name: XEngine_MQServiceApp-Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }} + path: XEngine_Release/ + retention-days: 1 \ No newline at end of file diff --git a/.github/workflows/macbuild.yml b/.github/workflows/macbuild.yml index a10fa5a..df0d78e 100644 --- a/.github/workflows/macbuild.yml +++ b/.github/workflows/macbuild.yml @@ -50,20 +50,13 @@ jobs: - name: Set up Dependency Arm64 Environment if: matrix.os == 'macos-14' run: | - cd libxengine - chmod 777 * - ./XEngine_LINEnv.sh -i 0 - latest_tag=$(git ls-remote --tags --sort="v:refname" https://github.com/libxengine/libxengine.git | awk '{print $2}' | sed 's/refs\/tags\///' | tail -n 1) - wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_Mac_Arm64.zip unzip ./XEngine_Mac_Arm64.zip -d ./XEngine_Mac_Arm64 cd XEngine_Mac_Arm64 - sudo mkdir -p /usr/local/include - sudo mkdir -p /usr/local/lib - sudo cp -rf ./XEngine_Include /usr/local/include - sudo find ./XEngine_Mac -name "*.dylib" -exec cp {} /usr/local/lib \; + chmod 777 * + ./XEngine_LINEnv.sh -i 3 - name: make debug run: | From ed34e76dced33a960392522d8c92906353a539d7 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 19 May 2025 17:46:25 +0800 Subject: [PATCH 08/28] ci:update --- .github/workflows/codeql.yml | 3 +++ .github/workflows/release.yml | 9 +++++++++ XEngine_Source/XEngine_Depend | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 1716d18..30a3ccf 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -40,6 +40,9 @@ jobs: git submodule init git submodule update + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: Set up Dependency Environment run: | cd libxengine diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c26ef01..6cda358 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,6 +25,15 @@ jobs: skip_unpack: true if_no_artifact_found: fail path: ./XRelease/ + - name: Download fedora build + uses: dawidd6/action-download-artifact@v6 + with: + workflow: fedora_build.yml + workflow_conclusion: success + check_artifacts: false + skip_unpack: true + if_no_artifact_found: fail + path: ./XRelease/ - name: Download debian build uses: dawidd6/action-download-artifact@v6 with: diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend index 2dd56fa..e56c4e9 160000 --- a/XEngine_Source/XEngine_Depend +++ b/XEngine_Source/XEngine_Depend @@ -1 +1 @@ -Subproject commit 2dd56facd7c93dfd3810d1db4341fff469e0786b +Subproject commit e56c4e9855a5a4f90ed804df8699a187a54f54d5 From 544e554b257f10931926d330a5a6db6ddd532f69 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 20 May 2025 16:22:09 +0800 Subject: [PATCH 09/28] modify:register and delete protocol use http instead --- .../MQCore_ProtocolModule.def | 4 +- .../ProtocolModule_Packet.cpp | 54 ++++++++ .../ProtocolModule_Packet.h | 1 + .../ProtocolModule_Parse.cpp | 83 +++++++++++ .../ProtocolModule_Parse.h | 1 + .../MQCore_ProtocolModule/Protocol_Define.h | 55 +++++++- XEngine_Source/MQCore_ProtocolModule/pch.cpp | 8 ++ .../MQService_HTTPTask/MQService_HTTPPost.cpp | 130 ++++++++++++++++++ .../MQService_HTTPTask/MQService_HTTPPost.h | 13 ++ .../XEngine_MQServiceApp/MQService_Hdr.h | 1 + .../MQService_HttpTask.cpp | 3 +- .../MQService_TCPTask.cpp | 126 ----------------- XEngine_Source/XEngine_MQServiceApp/Makefile | 5 +- .../XEngine_MQServiceApp.vcxproj | 2 + .../XEngine_MQServiceApp.vcxproj.filters | 12 ++ XEngine_Source/XQueue_ProtocolHdr.h | 12 +- 16 files changed, 375 insertions(+), 135 deletions(-) create mode 100644 XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp create mode 100644 XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.h diff --git a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def index 075760d..4ca8156 100644 --- a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def +++ b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def @@ -4,6 +4,7 @@ EXPORTS Protocol_GetLastError ProtocolModule_Packet_Common + ProtocolModule_Packet_HTTPCommon ProtocolModule_Packet_MQNumber ProtocolModule_Packet_PassAuth ProtocolModule_Packet_PassUser @@ -17,4 +18,5 @@ EXPORTS ProtocolModule_Packet_UNReadInsert ProtocolModule_Packet_UNReadDelete - ProtocolModule_Parse_Websocket \ No newline at end of file + ProtocolModule_Parse_Websocket + ProtocolModule_Parse_Register \ 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 e3a11a6..6088acf 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp @@ -82,6 +82,60 @@ bool CProtocolModule_Packet::ProtocolModule_Packet_Common(int nNetType, XENGINE_ return true; } /******************************************************************** +函数名称:ProtocolModule_Packet_HTTPCommon +函数功能:HTTP通用消息打包 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出包装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出包装大小 + 参数.三:nHTTPCode + In/Out:In + 类型:整数型 + 可空:Y + 意思:输入返回的code + 参数.四:lpszMSGBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入返回的消息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CProtocolModule_Packet::ProtocolModule_Packet_HTTPCommon(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nHTTPCode /* = 0 */, LPCXSTR lpszMSGBuffer /* = NULL */) +{ + Protocol_IsErrorOccur = false; + + if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARAMENT; + return false; + } + Json::Value st_JsonRoot; + + st_JsonRoot["code"] = nHTTPCode; + if (NULL == lpszMSGBuffer) + { + st_JsonRoot["msg"] = "success"; + } + else + { + st_JsonRoot["msg"] = lpszMSGBuffer; + } + + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); + memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); + return true; +} +/******************************************************************** 函数名称:ProtocolModule_Packet_MQNumber 函数功能:获取序列打包函数 参数.一:pSt_ProtocolHdr diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h index 3721aae..e4b74be 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h @@ -26,6 +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_HTTPCommon(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nHTTPCode = 0, LPCXSTR lpszMSGBuffer = NULL); bool ProtocolModule_Packet_MQNumber(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_MQNUMBER* pSt_MQNumber, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nNetType); 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); diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp index 7f12c5b..f17de8d 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp @@ -219,4 +219,87 @@ bool CProtocolModule_Parse::ProtocolModule_Parse_Websocket(LPCXSTR lpszMsgBuffer } } return true; +} +/******************************************************************** +函数名称:ProtocolModule_Parse_Register +函数功能:解析用户信息 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入要解析的大小 + 参数.三:pSt_UserInfo + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出解析的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CProtocolModule_Parse::ProtocolModule_Parse_Register(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERINFO* pSt_UserInfo) +{ + Protocol_IsErrorOccur = false; + + if ((NULL == lpszMsgBuffer) || (NULL == pSt_UserInfo)) + { + 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_JsonProtocol = st_JsonRoot["st_UserInfo"]; + if (!st_JsonProtocol["tszUserName"].isNull()) + { + _tcsxcpy(pSt_UserInfo->tszUserName, st_JsonProtocol["tszUserName"].asCString()); + } + if (!st_JsonProtocol["tszUserPass"].isNull()) + { + _tcsxcpy(pSt_UserInfo->tszUserPass, st_JsonProtocol["tszUserPass"].asCString()); + } + if (!st_JsonProtocol["tszEMailAddr"].isNull()) + { + _tcsxcpy(pSt_UserInfo->tszEMailAddr, st_JsonProtocol["tszEMailAddr"].asCString()); + } + if (!st_JsonProtocol["tszLoginTime"].isNull()) + { + _tcsxcpy(pSt_UserInfo->tszLoginTime, st_JsonProtocol["tszLoginTime"].asCString()); + } + if (!st_JsonProtocol["tszCreateTime"].isNull()) + { + _tcsxcpy(pSt_UserInfo->tszCreateTime, st_JsonProtocol["tszCreateTime"].asCString()); + } + if (!st_JsonProtocol["nPhoneNumber"].isNull()) + { + pSt_UserInfo->nPhoneNumber = st_JsonProtocol["nPhoneNumber"].asInt64(); + } + if (!st_JsonProtocol["nIDNumber"].isNull()) + { + pSt_UserInfo->nIDNumber = st_JsonProtocol["nIDNumber"].asInt64(); + } + if (!st_JsonProtocol["nUserLevel"].isNull()) + { + pSt_UserInfo->nUserLevel = st_JsonProtocol["nUserLevel"].asInt(); + } + if (!st_JsonProtocol["nUserState"].isNull()) + { + pSt_UserInfo->nUserState = st_JsonProtocol["nUserState"].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 90bdb22..bda97c7 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h @@ -18,6 +18,7 @@ class CProtocolModule_Parse ~CProtocolModule_Parse(); public: bool ProtocolModule_Parse_Websocket(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XCHAR* ptszMsgBuffer, int* pInt_MsgLen); + bool ProtocolModule_Parse_Register(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERINFO* pSt_UserInfo); protected: private: }; diff --git a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h index db79519..903dbad 100644 --- a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h +++ b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h @@ -62,6 +62,35 @@ extern "C" XLONG Protocol_GetLastError(int* pInt_SysError = NULL); *********************************************************************/ extern "C" 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); /******************************************************************** +函数名称:ProtocolModule_Packet_HTTPCommon +函数功能:HTTP通用消息打包 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出包装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出包装大小 + 参数.三:nHTTPCode + In/Out:In + 类型:整数型 + 可空:Y + 意思:输入返回的code + 参数.四:lpszMSGBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入返回的消息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ProtocolModule_Packet_HTTPCommon(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nHTTPCode = 0, LPCXSTR lpszMSGBuffer = NULL); +/******************************************************************** 函数名称:ProtocolModule_Packet_MQNumber 函数功能:获取序列打包函数 参数.一:pSt_ProtocolHdr @@ -435,4 +464,28 @@ extern "C" bool ProtocolModule_Packet_UNReadDelete(XHANDLE xhToken, XCHAR* ptszM 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ProtocolModule_Parse_Websocket(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOLHDR * pSt_ProtocolHdr = NULL, XCHAR *ptszMsgBuffer = NULL, int* pInt_MsgLen = NULL); \ No newline at end of file +extern "C" bool ProtocolModule_Parse_Websocket(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOLHDR * pSt_ProtocolHdr = NULL, XCHAR *ptszMsgBuffer = NULL, int* pInt_MsgLen = NULL); +/******************************************************************** +函数名称:ProtocolModule_Parse_Register +函数功能:解析用户信息 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入要解析的大小 + 参数.三:pSt_UserInfo + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出解析的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ProtocolModule_Parse_Register(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERINFO* pSt_UserInfo); \ No newline at end of file diff --git a/XEngine_Source/MQCore_ProtocolModule/pch.cpp b/XEngine_Source/MQCore_ProtocolModule/pch.cpp index 07f7080..601f347 100644 --- a/XEngine_Source/MQCore_ProtocolModule/pch.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/pch.cpp @@ -35,6 +35,10 @@ 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_HTTPCommon(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nHTTPCode, LPCXSTR lpszMSGBuffer) +{ + return m_ProtocolPacket.ProtocolModule_Packet_HTTPCommon(ptszMsgBuffer, pInt_MsgLen, nHTTPCode, lpszMSGBuffer); +} extern "C" bool ProtocolModule_Packet_MQNumber(XENGINE_PROTOCOLHDR * pSt_ProtocolHdr, XENGINE_MQNUMBER * pSt_MQNumber, XCHAR * ptszMsgBuffer, int* pInt_MsgLen, int nNetType) { return m_ProtocolPacket.ProtocolModule_Packet_MQNumber(pSt_ProtocolHdr, pSt_MQNumber, ptszMsgBuffer, pInt_MsgLen, nNetType); @@ -89,4 +93,8 @@ extern "C" bool ProtocolModule_Packet_UNReadDelete(XHANDLE xhToken, XCHAR * ptsz extern "C" bool ProtocolModule_Parse_Websocket(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOLHDR * pSt_ProtocolHdr, XCHAR *ptszMsgBuffer, int* pInt_MsgLen) { return m_ProtocolParse.ProtocolModule_Parse_Websocket(lpszMsgBuffer, nMsgLen, pSt_ProtocolHdr, ptszMsgBuffer, pInt_MsgLen); +} +extern "C" bool ProtocolModule_Parse_Register(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERINFO* pSt_UserInfo) +{ + return m_ProtocolParse.ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, pSt_UserInfo); } \ 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 new file mode 100644 index 0000000..07d5fc9 --- /dev/null +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -0,0 +1,130 @@ +#include "../MQService_Hdr.h" +/******************************************************************** +// Created: 2025/05/20 15:20:30 +// File Name: D:\XEngine_MQService\XEngine_Source\XEngine_MQServiceApp\MQService_HTTPTask\MQService_HTTPPost.cpp +// File Path: D:\XEngine_MQService\XEngine_Source\XEngine_MQServiceApp\MQService_HTTPTask +// File Base: MQService_HTTPPost +// File Ext: cpp +// Project: XEngine +// Author: qyt +// Purpose: HTTP POST方法处理 +// History: +*********************************************************************/ +bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LPCXSTR lpszMsgBuffer, int nMsgLen) +{ + int nSDLen = 0; + XCHAR tszSDBuffer[1024] = {}; + LPCXSTR lpszAPIRegister = _X("register"); + LPCXSTR lpszAPIDelete = _X("delete"); + + //判断请求 + if (0 == _tcsxnicmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister))) + { + XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; + if (!ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, &st_UserInfo)) + { + ProtocolModule_Packet_HTTPCommon(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_UserQuery(&st_UserInfo)) + { + ProtocolModule_Packet_HTTPCommon(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_EXISTED, _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; + } + if (!DBModule_MQUser_UserInsert(&st_UserInfo)) + { + ProtocolModule_Packet_HTTPCommon(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_SERVICE, _X("service is 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.tszPassRegister) > 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_MQ_REQUSERREG); + APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XPass.tszPassRegister, tszSDBuffer, &nHTTPCode, NULL, NULL, NULL, NULL, &st_HTTPParament); + if (200 != nHTTPCode) + { + DBModule_MQUser_UserDelete(&st_UserInfo); //删除 + ProtocolModule_Packet_HTTPCommon(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_APIREG, _X("service is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求远程注册失败,HTTPCode:%d"), lpszClientAddr, nHTTPCode); + return false; + } + } + //是否需要订阅公用消息队列 + if (st_DBConfig.st_MQData.bCommSub) + { + XENGINE_DBUSERKEY st_Userkey; + memset(&st_Userkey, '\0', sizeof(XENGINE_DBUSERKEY)); + + _tcsxcpy(st_Userkey.tszUserName, st_UserInfo.tszUserName); + _tcsxcpy(st_Userkey.tszKeyName, st_ServiceCfg.tszTopic); + //创建 + if (!DBModule_MQUser_KeyInsert(&st_Userkey)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP消息端:%s,绑定消息队列主题失败,主题名称:%s,错误:%lX"), lpszClientAddr, st_Userkey.tszKeyName, DBModule_GetLastError()); + } + } + ProtocolModule_Packet_HTTPCommon(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, st_UserInfo.tszUserName, st_UserInfo.tszUserPass); + } + else if (0 == _tcsxnicmp(lpszAPIDelete, lpszFuncName, _tcsxlen(lpszAPIDelete))) + { + XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; + + if (!DBModule_MQUser_UserDelete(&st_UserInfo)) + { + ProtocolModule_Packet_HTTPCommon(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_MQ_REQUSERDEL); + APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XPass.tszPassUNReg, tszSDBuffer, &nHTTPCode, NULL, NULL, NULL, NULL, &st_HTTPParament); + if (200 != nHTTPCode) + { + ProtocolModule_Packet_HTTPCommon(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_HTTPCommon(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 + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); + } + return true; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.h b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.h new file mode 100644 index 0000000..ab175de --- /dev/null +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.h @@ -0,0 +1,13 @@ +#pragma once +/******************************************************************** +// Created: 2025/05/20 15:18:46 +// File Name: D:\XEngine_MQService\XEngine_Source\XEngine_MQServiceApp\MQService_HTTPTask\MQService_HTTPPost.h +// File Path: D:\XEngine_MQService\XEngine_Source\XEngine_MQServiceApp\MQService_HTTPTask +// File Base: MQService_HTTPPost +// File Ext: h +// Project: XEngine +// Author: qyt +// Purpose: HTTP POST方法处理 +// History: +*********************************************************************/ +bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LPCXSTR lpszMsgBuffer, int nMsgLen); \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h index 5028709..c66fa68 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h @@ -59,6 +59,7 @@ using namespace std; #include "../MQCore_HelpModule/APIHelp_Error.h" #include "../MQCore_MemoryCache/MemoryCache_Define.h" #include "../MQCore_MemoryCache/MemoryCache_Error.h" +#include "MQService_HTTPTask/MQService_HTTPPost.h" extern bool bIsRun; extern bool bIsTest; diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp index 8e0d9ca..b5f5947 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp @@ -102,7 +102,8 @@ bool MessageQueue_Http_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST //判断请求 if (0 == _tcsxnicmp(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))) { diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp index 465a86f..168bc67 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp @@ -190,132 +190,6 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC SessionModule_Client_Delete(lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s客户端:%s,用户登出成功,用户名:%s"), lpszClientType, lpszClientAddr, tszUserName); } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUSERREG == pSt_ProtocolHdr->unOperatorCode) - { - XENGINE_PROTOCOL_USERINFO st_UserInfo; - memset(&st_UserInfo, '\0', sizeof(XENGINE_PROTOCOL_USERINFO)); - - memcpy(&st_UserInfo, lpszMsgBuffer, sizeof(XENGINE_PROTOCOL_USERINFO)); - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPUSERREG; - //是否需要代理处理 - if (_tcsxlen(st_ServiceCfg.st_XPass.tszPassRegister) > 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_MQ_REQUSERREG); - APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XPass.tszPassRegister, tszSDBuffer, &nHTTPCode, NULL, NULL, NULL, NULL, &st_HTTPParament); - if (200 != nHTTPCode) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_AUTH_APIREG; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, NULL, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s客户端:%s,请求远程注册失败,HTTPCode:%d"), lpszClientType, lpszClientAddr, nHTTPCode); - return false; - } - } - else - { - if (_tcsxlen(st_UserInfo.tszUserPass) <= 0) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_AUTH_USERPASS; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, NULL, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s客户端:%s,请求本地验证失败,密码为空"), lpszClientType, lpszClientAddr); - return false; - } - if (DBModule_MQUser_UserQuery(&st_UserInfo)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_AUTH_EXISTED; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, NULL, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s客户端:%s,请求用户注册失败,用户已经存在,错误:%lX"), lpszClientType, lpszClientAddr, SessionModule_GetLastError()); - return false; - } - if (!DBModule_MQUser_UserInsert(&st_UserInfo)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_AUTH_REGISTER; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, NULL, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s客户端:%s,请求用户注册失败,插入数据库失败,错误:%lX"), lpszClientType, lpszClientAddr, SessionModule_GetLastError()); - return false; - } - } - //是否需要订阅公用消息队列 - if (st_DBConfig.st_MQData.bCommSub) - { - XENGINE_DBUSERKEY st_Userkey; - memset(&st_Userkey, '\0', sizeof(XENGINE_DBUSERKEY)); - - _tcsxcpy(st_Userkey.tszUserName, st_UserInfo.tszUserName); - _tcsxcpy(st_Userkey.tszKeyName, st_ServiceCfg.tszTopic); - //创建 - if (!DBModule_MQUser_KeyInsert(&st_Userkey)) - { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("%s消息端:%s,绑定消息队列主题失败,主题名称:%s,错误:%lX"), lpszClientType, lpszClientAddr, st_Userkey.tszKeyName, DBModule_GetLastError()); - } - } - pSt_ProtocolHdr->wReserve = 0; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, NULL, 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_UserInfo.tszUserName, st_UserInfo.tszUserPass); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUSERDEL == pSt_ProtocolHdr->unOperatorCode) - { - XENGINE_PROTOCOL_USERINFO st_UserInfo; - memset(&st_UserInfo, '\0', sizeof(XENGINE_PROTOCOL_USERINFO)); - - memcpy(&st_UserInfo, lpszMsgBuffer, sizeof(XENGINE_PROTOCOL_USERINFO)); - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPUSERDEL; - - 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_MQ_REQUSERDEL); - APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XPass.tszPassUNReg, tszSDBuffer, &nHTTPCode, NULL, NULL, NULL, NULL, &st_HTTPParament); - if (200 != nHTTPCode) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_AUTH_APIDEL; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, NULL, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s客户端:%s,请求远程注销失败,错误:%lX,HTTPCode:%d"), lpszClientType, lpszClientAddr, nHTTPCode); - return false; - } - } - else - { - if (!DBModule_MQUser_UserDelete(&st_UserInfo)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_AUTH_DELETE; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, NULL, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s客户端:%s,请求用户删除失败,删除数据库失败,错误:%lX"), lpszClientType, lpszClientAddr, SessionModule_GetLastError()); - return false; - } - } - pSt_ProtocolHdr->wReserve = 0; - 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_Common(nNetType, pSt_ProtocolHdr, NULL, 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_UserInfo.tszUserName); - } } else if (ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ == pSt_ProtocolHdr->unOperatorType) { diff --git a/XEngine_Source/XEngine_MQServiceApp/Makefile b/XEngine_Source/XEngine_MQServiceApp/Makefile index 417bb54..3bc422b 100644 --- a/XEngine_Source/XEngine_MQServiceApp/Makefile +++ b/XEngine_Source/XEngine_MQServiceApp/Makefile @@ -7,7 +7,7 @@ LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lMQCore_ConfigModule -lMQCore_ProtocolModule -lMQCore_SessionModule -lMQCore_MemoryCache -lMQCore_DBModule -lMQCore_HelpModule\ -ljsoncpp -lXEngine_InfoReport LIBEX = -OBJECTS = MQService_Net.o MQService_Config.o MQService_TCPTask.o MQService_HttpTask.o MQService_WSTask.o MQService_Task.o MQService_MQTTTask.o XEngine_MQServiceApp.o +OBJECTS = MQService_Net.o MQService_Config.o MQService_TCPTask.o MQService_HttpTask.o MQService_WSTask.o MQService_Task.o MQService_MQTTTask.o MQService_HTTPPost.o XEngine_MQServiceApp.o ifeq ($(RELEASE),1) FLAGS = -c -D _RELEASE @@ -61,6 +61,9 @@ MQService_Task.o:./MQService_Task.cpp MQService_MQTTTask.o:./MQService_MQTTTask.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MQService_MQTTTask.cpp +MQService_HTTPPost.o:./MQService_HTTPTask/MQService_HTTPPost.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MQService_HTTPTask/MQService_HTTPPost.cpp + XEngine_MQServiceApp.o:./XEngine_MQServiceApp.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_MQServiceApp.cpp diff --git a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj index 8c20b2d..219f494 100644 --- a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj +++ b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj @@ -236,6 +236,7 @@ + @@ -247,6 +248,7 @@ + diff --git a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj.filters b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj.filters index 33d8cc5..6b1e375 100644 --- a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj.filters +++ b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj.filters @@ -13,6 +13,12 @@ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + {68cf4dfc-0b9c-4a4f-8449-80ebb78bd5e0} + + + {7871adb5-b300-47af-adb4-bc1d9bcf6039} + @@ -39,6 +45,9 @@ 源文件 + + 源文件\MQService_HTTPTask + @@ -65,5 +74,8 @@ 头文件 + + 头文件\MQService_HTTPTask + \ No newline at end of file diff --git a/XEngine_Source/XQueue_ProtocolHdr.h b/XEngine_Source/XQueue_ProtocolHdr.h index 9148158..35c88c4 100644 --- a/XEngine_Source/XQueue_ProtocolHdr.h +++ b/XEngine_Source/XQueue_ProtocolHdr.h @@ -58,11 +58,6 @@ #define ERROR_XENGINE_MESSAGE_AUTH_HTTP 0x002 //HTTP PASS验证失败 #define ERROR_XENGINE_MESSAGE_AUTH_USERPASS 0x003 //用户或者密码错误 #define ERROR_XENGINE_MESSAGE_AUTH_NOTLOGIN 0x004 //没有登陆,禁止操作 -#define ERROR_XENGINE_MESSAGE_AUTH_APIREG 0x005 //HTTP 远程注册失败 -#define ERROR_XENGINE_MESSAGE_AUTH_EXISTED 0x006 //用户已经存在 -#define ERROR_XENGINE_MESSAGE_AUTH_REGISTER 0x007 //用户注册失败,数据错误 -#define ERROR_XENGINE_MESSAGE_AUTH_APIDEL 0x008 //HTTP API删除失败 -#define ERROR_XENGINE_MESSAGE_AUTH_DELETE 0x009 //本地删除失败 #define ERROR_XENGINE_MESSAGE_XMQ_EXISTED 0x101 //消息存在 #define ERROR_XENGINE_MESSAGE_XMQ_INSERT 0x102 //插入数据库失败 @@ -85,6 +80,13 @@ #define ERROR_XENGINE_MESSAGE_HTTP_PARAMENT 0x201 //HTTP请求参数错误 #define ERROR_XENGINE_MESSAGE_HTTP_AUTHORIZE 0x202 //验证失败没有权限 #define ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND 0x203 //没有找到请求的数据 +#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 //本地删除失败 /////////////////////////////////////////////////////////////////////////// // 导出的数据结构 /////////////////////////////////////////////////////////////////////////// From 01545719da525eae6322cb6c256214f59ef0f6e2 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 20 May 2025 16:58:32 +0800 Subject: [PATCH 10/28] modify:http get move to http task dir --- .../MQService_HTTPTask/MQService_HTTPGet.cpp | 137 ++++++++++++++++++ .../MQService_HTTPTask/MQService_HTTPGet.h | 13 ++ .../XEngine_MQServiceApp/MQService_Hdr.h | 1 + .../MQService_HttpTask.cpp | 132 +---------------- XEngine_Source/XEngine_MQServiceApp/Makefile | 4 +- .../XEngine_MQServiceApp.vcxproj | 2 + .../XEngine_MQServiceApp.vcxproj.filters | 6 + 7 files changed, 166 insertions(+), 129 deletions(-) create mode 100644 XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp create mode 100644 XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.h diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp new file mode 100644 index 0000000..dedf631 --- /dev/null +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp @@ -0,0 +1,137 @@ +#include "../MQService_Hdr.h" +/******************************************************************** +// Created: 2025/05/20 16:33:21 +// File Name: D:\XEngine_MQService\XEngine_Source\XEngine_MQServiceApp\MQService_HTTPTask\MQService_HTTPGet.cpp +// File Path: D:\XEngine_MQService\XEngine_Source\XEngine_MQServiceApp\MQService_HTTPTask +// File Base: MQService_HTTPGet +// File Ext: cpp +// Project: XEngine +// Author: qyt +// Purpose: HTTP GET方法处理 +// History: +*********************************************************************/ +bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LPCXSTR lpszMsgBuffer, int nMsgLen, int nMethodPos, XCHAR*** pptszListHdr, int nUrlCount) +{ + int nSDLen = 0; + XCHAR tszSDBuffer[1024] = {}; + XCHAR tszKeyStr[MAX_PATH] = {}; + XCHAR tszVluStr[MAX_PATH] = {}; + LPCXSTR lpszAPIGet = _X("get"); + LPCXSTR lpszAPIUser = _X("user"); + LPCXSTR lpszAPITopic = _X("topic"); + LPCXSTR lpszAPIOnline = _X("online"); + LPCXSTR lpszAPIDelete = _X("delete"); + + if (0 == _tcsxnicmp(lpszAPIUser, lpszFuncName, _tcsxlen(lpszAPIUser))) + { + //用户 http://127.0.0.1:5202/api?function=user&token=0 + int nListCount = 0; + XENGINE_PROTOCOL_USERINFO** ppSt_UserInfo; + DBModule_MQUser_UserList(&ppSt_UserInfo, &nListCount); + ProtocolModule_Packet_UserList(tszSDBuffer, &nSDLen, &ppSt_UserInfo, nListCount); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + 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(lpszAPIOnline, lpszFuncName, _tcsxlen(lpszAPIOnline))) + { + //获取在线用户 http://127.0.0.1:5202/api?function=online&token=0&type=0 + int nListCount = 0; + XCHAR** pptszListAddr; + + BaseLib_String_GetKeyValue((*pptszListHdr)[nMethodPos + 1], _X("="), tszKeyStr, tszVluStr); + SessionModule_Client_GetListAddr(&pptszListAddr, &nListCount, _ttxoi(tszVluStr)); + 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 == _tcsxnicmp(lpszAPITopic, lpszFuncName, _tcsxlen(lpszAPITopic))) + { + //主题 http://127.0.0.1:5202/api?function=topic&name=comm + if (2 == nUrlCount) + { + 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 + { + int nDBCount = 0; + BaseLib_String_GetKeyValue((*pptszListHdr)[nMethodPos + 1], _X("="), tszKeyStr, tszVluStr); + DBModule_MQData_GetLeftCount(tszVluStr, 0, &nDBCount); + ProtocolModule_Packet_TopicName(tszSDBuffer, &nSDLen, tszVluStr, nDBCount); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取主题列表请求成功,获取到的主题消息个数:%d"), lpszClientAddr, nDBCount); + } + } + else if (0 == _tcsxnicmp(lpszAPIDelete, lpszFuncName, _tcsxlen(lpszAPIDelete))) + { + //http://127.0.0.1:5202/api?function=delete&type=0&name=comm + BaseLib_String_GetKeyValue((*pptszListHdr)[nMethodPos + 2], _X("="), tszKeyStr, tszVluStr); + if (0 == _ttxoi(tszVluStr)) + { + //type = 0 删除主题 + memset(tszVluStr, '\0', sizeof(tszVluStr)); + BaseLib_String_GetKeyValue((*pptszListHdr)[nMethodPos + 3], _X("="), tszKeyStr, tszVluStr); + + XENGINE_DBTOPICOWNER st_DBOwner = {}; + XENGINE_DBUSERKEY st_UserKey = {}; + XENGINE_DBTIMERELEASE st_DBInfo = {}; + + _tcsxcpy(st_DBOwner.tszQueueName, tszVluStr); + _tcsxcpy(st_UserKey.tszKeyName, tszVluStr); + _tcsxcpy(st_DBInfo.tszQueueName, tszVluStr); + if (!DBModule_MQUser_OwnerDelete(&st_DBOwner)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, "topic name not found"); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求HTTP删除主题失败,主题不存在:%s"), lpszClientAddr, tszVluStr); + return false; + } + //清楚数据库 + APIHelp_Counter_SerialDel(tszVluStr); + DBModule_MQData_DeleteTable(tszVluStr); + 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, tszVluStr); + } + else + { + // 删除用户 + memset(tszVluStr, '\0', sizeof(tszVluStr)); + BaseLib_String_GetKeyValue((*pptszListHdr)[nMethodPos + 3], _X("="), tszKeyStr, tszVluStr); + + XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; + XENGINE_DBUSERKEY st_UserKey = {}; + XENGINE_DBTOPICOWNER st_DBOwner = {}; + + _tcsxcpy(st_UserInfo.tszUserName, tszVluStr); + _tcsxcpy(st_UserKey.tszUserName, tszVluStr); + _tcsxcpy(st_DBOwner.tszUserName, tszVluStr); + + if (!DBModule_MQUser_UserQuery(&st_UserInfo)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, "user name not found"); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求HTTP删除用户失败,用户不存在:%s"), lpszClientAddr, st_UserInfo.tszUserName); + return false; + } + DBModule_MQUser_UserDelete(&st_UserInfo); + 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); + } + } + return true; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.h b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.h new file mode 100644 index 0000000..8fcfdd3 --- /dev/null +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.h @@ -0,0 +1,13 @@ +#pragma once +/******************************************************************** +// Created: 2025/05/20 16:33:07 +// File Name: D:\XEngine_MQService\XEngine_Source\XEngine_MQServiceApp\MQService_HTTPTask\MQService_HTTPGet.h +// File Path: D:\XEngine_MQService\XEngine_Source\XEngine_MQServiceApp\MQService_HTTPTask +// File Base: MQService_HTTPGet +// File Ext: h +// Project: XEngine +// Author: qyt +// Purpose: HTTP GET方法处理 +// History: +*********************************************************************/ +bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LPCXSTR lpszMsgBuffer, int nMsgLen, int nMethodPos, XCHAR*** pptszListHdr, int nUrlCount); \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h index c66fa68..60c1861 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h @@ -60,6 +60,7 @@ using namespace std; #include "../MQCore_MemoryCache/MemoryCache_Define.h" #include "../MQCore_MemoryCache/MemoryCache_Error.h" #include "MQService_HTTPTask/MQService_HTTPPost.h" +#include "MQService_HTTPTask/MQService_HTTPGet.h" extern bool bIsRun; extern bool bIsTest; diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp index b5f5947..480db3b 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp @@ -41,21 +41,12 @@ XHTHREAD CALLBACK MessageQueue_HttpThread(XPVOID lParam) bool MessageQueue_Http_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR** pptszListHdr, int nHdrCount) { int nPKTLen = 4096; - XCHAR tszPKTBuffer[4096]; - XCHAR tszKey[MAX_PATH]; - XCHAR tszValue[MAX_PATH]; - - memset(tszKey, '\0', MAX_PATH); - memset(tszValue, '\0', MAX_PATH); - memset(tszPKTBuffer, '\0', sizeof(tszPKTBuffer)); + XCHAR tszPKTBuffer[4096] = {}; + XCHAR tszKey[MAX_PATH] = {}; + XCHAR tszValue[MAX_PATH] = {}; LPCXSTR lpszPostMethod = _X("POST"); LPCXSTR lpszGetMethod = _X("GET"); - LPCXSTR lpszAPIGet = _X("get"); - LPCXSTR lpszAPIUser = _X("user"); - LPCXSTR lpszAPITopic = _X("topic"); - LPCXSTR lpszAPIOnline = _X("online"); - LPCXSTR lpszAPIDelete = _X("delete"); int nUrlCount = 0; XCHAR** ppSt_ListUrl; @@ -107,123 +98,8 @@ bool MessageQueue_Http_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST } else if (0 == _tcsxnicmp(lpszGetMethod, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszGetMethod))) { - //获取函数 - memset(tszValue, '\0', MAX_PATH); BaseLib_String_GetKeyValue(ppSt_ListUrl[0], _X("="), tszKey, tszValue); - if (0 == _tcsxnicmp(lpszAPIUser, tszValue, _tcsxlen(lpszAPIUser))) - { - //用户 http://127.0.0.1:5202/api?function=user - int nListCount = 0; - XENGINE_PROTOCOL_USERINFO** ppSt_UserInfo; - DBModule_MQUser_UserList(&ppSt_UserInfo, &nListCount); - ProtocolModule_Packet_UserList(tszPKTBuffer, &nPKTLen, &ppSt_UserInfo, nListCount); - BaseLib_Memory_Free((XPPPMEM)&ppSt_UserInfo, nListCount); - - XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取用户列表请求成功,获取到的用户列表个数:%d"), lpszClientAddr, nListCount); - } - else if (0 == _tcsxnicmp(lpszAPIOnline, tszValue, _tcsxlen(lpszAPIOnline))) - { - //获取在线用户 http://127.0.0.1:5202/api?function=online&type=0 - int nListCount = 0; - XCHAR** pptszListAddr; - - BaseLib_String_GetKeyValue(ppSt_ListUrl[nMethodPos + 1], _X("="), tszKey, tszValue); - SessionModule_Client_GetListAddr(&pptszListAddr, &nListCount, _ttxoi(tszValue)); - ProtocolModule_Packet_OnlineList(tszPKTBuffer, &nPKTLen, &pptszListAddr, nListCount); - BaseLib_Memory_Free((XPPPMEM)&pptszListAddr, nListCount); - XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取在线用户列表请求成功,获取到的列表个数:%d"), lpszClientAddr, nListCount); - } - else if (0 == _tcsxnicmp(lpszAPITopic, tszValue, _tcsxlen(lpszAPITopic))) - { - //主题 http://127.0.0.1:5202/api?function=topic&name=comm - if (2 == nUrlCount) - { - int nListCount = 0; - XCHAR** ppszTableName; - DBModule_MQData_ShowTable(&ppszTableName, &nListCount); - ProtocolModule_Packet_TopicList(tszPKTBuffer, &nPKTLen, &ppszTableName, nListCount); - BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); - XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取主题列表请求成功,获取到的主题列表个数:%d"), lpszClientAddr, nListCount); - } - else - { - int nDBCount = 0; - BaseLib_String_GetKeyValue(ppSt_ListUrl[nMethodPos + 1], _X("="), tszKey, tszValue); - DBModule_MQData_GetLeftCount(tszValue, 0, &nDBCount); - ProtocolModule_Packet_TopicName(tszPKTBuffer, &nPKTLen, tszValue, nDBCount); - XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取主题列表请求成功,获取到的主题消息个数:%d"), lpszClientAddr, nDBCount); - } - } - else if (0 == _tcsxnicmp(lpszAPIDelete, tszValue, _tcsxlen(lpszAPIDelete))) - { - //http://127.0.0.1:5202/api?function=delete&type=0&name=comm - - memset(tszValue, '\0', MAX_PATH); - BaseLib_String_GetKeyValue(ppSt_ListUrl[nMethodPos + 2], _X("="), tszKey, tszValue); - if (0 == _ttxoi(tszValue)) - { - //type = 0 删除主题 - memset(tszValue, '\0', MAX_PATH); - BaseLib_String_GetKeyValue(ppSt_ListUrl[nMethodPos + 3], _X("="), tszKey, tszValue); - - XENGINE_DBTOPICOWNER st_DBOwner = {}; - XENGINE_DBUSERKEY st_UserKey = {}; - XENGINE_DBTIMERELEASE st_DBInfo = {}; - - _tcsxcpy(st_DBOwner.tszQueueName, tszValue); - _tcsxcpy(st_UserKey.tszKeyName, tszValue); - _tcsxcpy(st_DBInfo.tszQueueName, tszValue); - if (!DBModule_MQUser_OwnerDelete(&st_DBOwner)) - { - ProtocolModule_Packet_Http(tszPKTBuffer, &nPKTLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, "topic name not found"); - XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求HTTP删除主题失败,主题不存在:%s"), lpszClientAddr, tszValue); - return false; - } - //清楚数据库 - APIHelp_Counter_SerialDel(tszValue); - DBModule_MQData_DeleteTable(tszValue); - DBModule_MQUser_KeyDelete(&st_UserKey); - DBModule_MQUser_TimeDelete(&st_DBInfo); - - ProtocolModule_Packet_Http(tszPKTBuffer, &nPKTLen); - XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求主题删除成功,主题名:%s"), lpszClientAddr, tszValue); - } - else - { - // 删除用户 - memset(tszValue, '\0', MAX_PATH); - BaseLib_String_GetKeyValue(ppSt_ListUrl[nMethodPos + 3], _X("="), tszKey, tszValue); - - XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; - XENGINE_DBUSERKEY st_UserKey = {}; - XENGINE_DBTOPICOWNER st_DBOwner = {}; - - _tcsxcpy(st_UserInfo.tszUserName, tszValue); - _tcsxcpy(st_UserKey.tszUserName, tszValue); - _tcsxcpy(st_DBOwner.tszUserName, tszValue); - - if (!DBModule_MQUser_UserQuery(&st_UserInfo)) - { - ProtocolModule_Packet_Http(tszPKTBuffer, &nPKTLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, "user name not found"); - XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求HTTP删除用户失败,用户不存在:%s"), lpszClientAddr, st_UserInfo.tszUserName); - return false; - } - DBModule_MQUser_UserDelete(&st_UserInfo); - DBModule_MQUser_KeyDelete(&st_UserKey); - DBModule_MQUser_OwnerDelete(&st_DBOwner); - - ProtocolModule_Packet_Http(tszPKTBuffer, &nPKTLen); - XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求用户删除成功,用户名:%s"), lpszClientAddr, st_UserInfo.tszUserName); - } - } + MessageQueue_HttpTask_Get(lpszClientAddr, tszValue, lpszMsgBuffer, nMsgLen, nMethodPos, &ppSt_ListUrl, nUrlCount); } else { diff --git a/XEngine_Source/XEngine_MQServiceApp/Makefile b/XEngine_Source/XEngine_MQServiceApp/Makefile index 3bc422b..00e42ad 100644 --- a/XEngine_Source/XEngine_MQServiceApp/Makefile +++ b/XEngine_Source/XEngine_MQServiceApp/Makefile @@ -7,7 +7,7 @@ LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lMQCore_ConfigModule -lMQCore_ProtocolModule -lMQCore_SessionModule -lMQCore_MemoryCache -lMQCore_DBModule -lMQCore_HelpModule\ -ljsoncpp -lXEngine_InfoReport LIBEX = -OBJECTS = MQService_Net.o MQService_Config.o MQService_TCPTask.o MQService_HttpTask.o MQService_WSTask.o MQService_Task.o MQService_MQTTTask.o MQService_HTTPPost.o XEngine_MQServiceApp.o +OBJECTS = MQService_Net.o MQService_Config.o MQService_TCPTask.o MQService_HttpTask.o MQService_WSTask.o MQService_Task.o MQService_MQTTTask.o MQService_HTTPPost.o MQService_HTTPGet.o XEngine_MQServiceApp.o ifeq ($(RELEASE),1) FLAGS = -c -D _RELEASE @@ -63,6 +63,8 @@ MQService_MQTTTask.o:./MQService_MQTTTask.cpp MQService_HTTPPost.o:./MQService_HTTPTask/MQService_HTTPPost.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MQService_HTTPTask/MQService_HTTPPost.cpp +MQService_HTTPGet.o:./MQService_HTTPTask/MQService_HTTPGet.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./MQService_HTTPTask/MQService_HTTPGet.cpp XEngine_MQServiceApp.o:./XEngine_MQServiceApp.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_MQServiceApp.cpp diff --git a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj index 219f494..a3a9b07 100644 --- a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj +++ b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj @@ -236,6 +236,7 @@ + @@ -248,6 +249,7 @@ + diff --git a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj.filters b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj.filters index 6b1e375..6da71da 100644 --- a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj.filters +++ b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj.filters @@ -48,6 +48,9 @@ 源文件\MQService_HTTPTask + + 源文件\MQService_HTTPTask + @@ -77,5 +80,8 @@ 头文件\MQService_HTTPTask + + 头文件\MQService_HTTPTask + \ No newline at end of file From e40b0753eaa3abb04d061d59a25f5d73fea6fe4f Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 21 May 2025 16:40:19 +0800 Subject: [PATCH 11/28] fixed:delete not parse protocol update:depend library --- XEngine_Source/XEngine_Depend | 2 +- XEngine_Source/XEngine_MQServiceApp.sln | 15 +++++++++++++++ .../MQService_HTTPTask/MQService_HTTPPost.cpp | 8 +++++++- .../XEngine_MQServiceApp/MQService_Hdr.h | 9 ++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend index e56c4e9..55c5d1a 160000 --- a/XEngine_Source/XEngine_Depend +++ b/XEngine_Source/XEngine_Depend @@ -1 +1 @@ -Subproject commit e56c4e9855a5a4f90ed804df8699a187a54f54d5 +Subproject commit 55c5d1a2f22679d2daec1492fea98184cdbfc32f diff --git a/XEngine_Source/XEngine_MQServiceApp.sln b/XEngine_Source/XEngine_MQServiceApp.sln index 0e0bd2a..2ecbe3b 100644 --- a/XEngine_Source/XEngine_MQServiceApp.sln +++ b/XEngine_Source/XEngine_MQServiceApp.sln @@ -50,6 +50,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MQCore_MemoryCache", "MQCor EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MQCore_HelpModule", "MQCore_HelpModule\MQCore_HelpModule.vcxproj", "{4B061F8B-A783-45EA-A8D1-78F9668C49D2}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_Token", "XEngine_Depend\XEngine_Module\XEngine_Token\XEngine_Token.vcxproj", "{E17E889F-D826-413F-854E-DBA6000B4DA7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 @@ -168,6 +170,18 @@ Global {4B061F8B-A783-45EA-A8D1-78F9668C49D2}.Release|x64.Build.0 = Release|x64 {4B061F8B-A783-45EA-A8D1-78F9668C49D2}.Release|x86.ActiveCfg = Release|Win32 {4B061F8B-A783-45EA-A8D1-78F9668C49D2}.Release|x86.Build.0 = Release|Win32 + {E17E889F-D826-413F-854E-DBA6000B4DA7}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {E17E889F-D826-413F-854E-DBA6000B4DA7}.Debug|ARM64.Build.0 = Debug|ARM64 + {E17E889F-D826-413F-854E-DBA6000B4DA7}.Debug|x64.ActiveCfg = Debug|x64 + {E17E889F-D826-413F-854E-DBA6000B4DA7}.Debug|x64.Build.0 = Debug|x64 + {E17E889F-D826-413F-854E-DBA6000B4DA7}.Debug|x86.ActiveCfg = Debug|Win32 + {E17E889F-D826-413F-854E-DBA6000B4DA7}.Debug|x86.Build.0 = Debug|Win32 + {E17E889F-D826-413F-854E-DBA6000B4DA7}.Release|ARM64.ActiveCfg = Release|ARM64 + {E17E889F-D826-413F-854E-DBA6000B4DA7}.Release|ARM64.Build.0 = Release|ARM64 + {E17E889F-D826-413F-854E-DBA6000B4DA7}.Release|x64.ActiveCfg = Release|x64 + {E17E889F-D826-413F-854E-DBA6000B4DA7}.Release|x64.Build.0 = Release|x64 + {E17E889F-D826-413F-854E-DBA6000B4DA7}.Release|x86.ActiveCfg = Release|Win32 + {E17E889F-D826-413F-854E-DBA6000B4DA7}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -175,6 +189,7 @@ Global GlobalSection(NestedProjects) = preSolution {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} = {BAC91AAE-D438-4999-9541-EB8804B12F0C} {F6520D2C-BB8E-45BB-964B-F5D6A4318A89} = {BAC91AAE-D438-4999-9541-EB8804B12F0C} + {E17E889F-D826-413F-854E-DBA6000B4DA7} = {BAC91AAE-D438-4999-9541-EB8804B12F0C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {EFADBBBD-43B1-4B9B-9DD8-04415EBEFDA7} diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 07d5fc9..6a0f2ea 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -82,7 +82,13 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP else if (0 == _tcsxnicmp(lpszAPIDelete, lpszFuncName, _tcsxlen(lpszAPIDelete))) { XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; - + if (!ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, &st_UserInfo)) + { + ProtocolModule_Packet_HTTPCommon(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_HTTPCommon(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_DELETE, _X("delete user failure")); diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h index 60c1861..cb5ba9d 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h @@ -45,7 +45,8 @@ using namespace std; #include #include "../XEngine_Depend/XEngine_Module/XEngine_InfoReport/InfoReport_Define.h" #include "../XEngine_Depend/XEngine_Module/XEngine_InfoReport/InfoReport_Error.h" - +#include "../XEngine_Depend/XEngine_Module/XEngine_Token/Session_Define.h" +#include "../XEngine_Depend/XEngine_Module/XEngine_Token/Session_Error.h" #include "../XQueue_ProtocolHdr.h" #include "../MQCore_ConfigModule/Config_Define.h" #include "../MQCore_ConfigModule/Config_Error.h" @@ -110,6 +111,7 @@ extern MESSAGEQUEUE_DBCONFIG st_DBConfig; #pragma comment(lib,"../x64/Debug/MQCore_DBModule.lib") #pragma comment(lib,"../x64/Debug/MQCore_HelpModule.lib") #pragma comment(lib,"../x64/Debug/XEngine_InfoReport.lib") +#pragma comment(lib,"../x64/Debug/XEngine_Token.lib") #pragma comment(lib,"../x64/Debug/MQCore_MemoryCache.lib") #elif _M_ARM64 #pragma comment(lib,"../ARM64/Debug/MQCore_ConfigModule.lib") @@ -118,6 +120,7 @@ extern MESSAGEQUEUE_DBCONFIG st_DBConfig; #pragma comment(lib,"../ARM64/Debug/MQCore_DBModule.lib") #pragma comment(lib,"../ARM64/Debug/MQCore_HelpModule.lib") #pragma comment(lib,"../ARM64/Debug/XEngine_InfoReport.lib") +#pragma comment(lib,"../ARM64/Debug/XEngine_Token.lib") #pragma comment(lib,"../ARM64/Debug/MQCore_MemoryCache.lib") #elif _M_IX86 #pragma comment(lib,"../Debug/MQCore_ConfigModule.lib") @@ -126,6 +129,7 @@ extern MESSAGEQUEUE_DBCONFIG st_DBConfig; #pragma comment(lib,"../Debug/MQCore_DBModule.lib") #pragma comment(lib,"../Debug/MQCore_HelpModule.lib") #pragma comment(lib,"../Debug/XEngine_InfoReport.lib") +#pragma comment(lib,"../Debug/XEngine_Token.lib") #pragma comment(lib,"../Debug/MQCore_MemoryCache.lib") #endif #else @@ -136,6 +140,7 @@ extern MESSAGEQUEUE_DBCONFIG st_DBConfig; #pragma comment(lib,"../x64/Release/MQCore_DBModule.lib") #pragma comment(lib,"../x64/Release/MQCore_HelpModule.lib") #pragma comment(lib,"../x64/Release/XEngine_InfoReport.lib") +#pragma comment(lib,"../x64/Release/XEngine_Token.lib") #pragma comment(lib,"../x64/Release/MQCore_MemoryCache.lib") #elif _M_ARM64 #pragma comment(lib,"../ARM64/Release/MQCore_ConfigModule.lib") @@ -144,6 +149,7 @@ extern MESSAGEQUEUE_DBCONFIG st_DBConfig; #pragma comment(lib,"../ARM64/Release/MQCore_DBModule.lib") #pragma comment(lib,"../ARM64/Release/MQCore_HelpModule.lib") #pragma comment(lib,"../ARM64/Release/XEngine_InfoReport.lib") +#pragma comment(lib,"../ARM64/Release/XEngine_Token.lib") #pragma comment(lib,"../ARM64/Release/MQCore_MemoryCache.lib") #elif _M_IX86 #pragma comment(lib,"../Release/MQCore_ConfigModule.lib") @@ -152,6 +158,7 @@ extern MESSAGEQUEUE_DBCONFIG st_DBConfig; #pragma comment(lib,"../Release/MQCore_DBModule.lib") #pragma comment(lib,"../Release/MQCore_HelpModule.lib") #pragma comment(lib,"../Release/XEngine_InfoReport.lib") +#pragma comment(lib,"../Release/XEngine_Token.lib") #pragma comment(lib,"../Release/MQCore_MemoryCache.lib") #endif #endif From 40ee635a03b84e94bbbda859723bc6b89543ad8d Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 21 May 2025 16:52:58 +0800 Subject: [PATCH 12/28] delete:redundant functions --- .../MQCore_ProtocolModule.def | 1 - .../ProtocolModule_Packet.cpp | 54 ------------------- .../ProtocolModule_Packet.h | 1 - .../MQCore_ProtocolModule/Protocol_Define.h | 29 ---------- XEngine_Source/MQCore_ProtocolModule/pch.cpp | 4 -- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 18 +++---- 6 files changed, 9 insertions(+), 98 deletions(-) diff --git a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def index 4ca8156..6944062 100644 --- a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def +++ b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def @@ -4,7 +4,6 @@ EXPORTS Protocol_GetLastError ProtocolModule_Packet_Common - ProtocolModule_Packet_HTTPCommon ProtocolModule_Packet_MQNumber ProtocolModule_Packet_PassAuth ProtocolModule_Packet_PassUser diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp index 6088acf..e3a11a6 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp @@ -82,60 +82,6 @@ bool CProtocolModule_Packet::ProtocolModule_Packet_Common(int nNetType, XENGINE_ return true; } /******************************************************************** -函数名称:ProtocolModule_Packet_HTTPCommon -函数功能:HTTP通用消息打包 - 参数.一:ptszMsgBuffer - In/Out:Out - 类型:字符指针 - 可空:N - 意思:导出包装好的缓冲区 - 参数.二:pInt_MsgLen - In/Out:Out - 类型:整数型指针 - 可空:N - 意思:输出包装大小 - 参数.三:nHTTPCode - In/Out:In - 类型:整数型 - 可空:Y - 意思:输入返回的code - 参数.四:lpszMSGBuffer - In/Out:In - 类型:常量字符指针 - 可空:N - 意思:输入返回的消息 -返回值 - 类型:逻辑型 - 意思:是否成功 -备注: -*********************************************************************/ -bool CProtocolModule_Packet::ProtocolModule_Packet_HTTPCommon(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nHTTPCode /* = 0 */, LPCXSTR lpszMSGBuffer /* = NULL */) -{ - Protocol_IsErrorOccur = false; - - if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) - { - Protocol_IsErrorOccur = true; - Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARAMENT; - return false; - } - Json::Value st_JsonRoot; - - st_JsonRoot["code"] = nHTTPCode; - if (NULL == lpszMSGBuffer) - { - st_JsonRoot["msg"] = "success"; - } - else - { - st_JsonRoot["msg"] = lpszMSGBuffer; - } - - *pInt_MsgLen = st_JsonRoot.toStyledString().length(); - memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); - return true; -} -/******************************************************************** 函数名称:ProtocolModule_Packet_MQNumber 函数功能:获取序列打包函数 参数.一:pSt_ProtocolHdr diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h index e4b74be..3721aae 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h @@ -26,7 +26,6 @@ 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_HTTPCommon(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nHTTPCode = 0, LPCXSTR lpszMSGBuffer = NULL); bool ProtocolModule_Packet_MQNumber(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_MQNUMBER* pSt_MQNumber, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nNetType); 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); diff --git a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h index 903dbad..1962946 100644 --- a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h +++ b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h @@ -62,35 +62,6 @@ extern "C" XLONG Protocol_GetLastError(int* pInt_SysError = NULL); *********************************************************************/ extern "C" 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); /******************************************************************** -函数名称:ProtocolModule_Packet_HTTPCommon -函数功能:HTTP通用消息打包 - 参数.一:ptszMsgBuffer - In/Out:Out - 类型:字符指针 - 可空:N - 意思:导出包装好的缓冲区 - 参数.二:pInt_MsgLen - In/Out:Out - 类型:整数型指针 - 可空:N - 意思:输出包装大小 - 参数.三:nHTTPCode - In/Out:In - 类型:整数型 - 可空:Y - 意思:输入返回的code - 参数.四:lpszMSGBuffer - In/Out:In - 类型:常量字符指针 - 可空:N - 意思:输入返回的消息 -返回值 - 类型:逻辑型 - 意思:是否成功 -备注: -*********************************************************************/ -extern "C" bool ProtocolModule_Packet_HTTPCommon(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nHTTPCode = 0, LPCXSTR lpszMSGBuffer = NULL); -/******************************************************************** 函数名称:ProtocolModule_Packet_MQNumber 函数功能:获取序列打包函数 参数.一:pSt_ProtocolHdr diff --git a/XEngine_Source/MQCore_ProtocolModule/pch.cpp b/XEngine_Source/MQCore_ProtocolModule/pch.cpp index 601f347..1fc2235 100644 --- a/XEngine_Source/MQCore_ProtocolModule/pch.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/pch.cpp @@ -35,10 +35,6 @@ 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_HTTPCommon(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nHTTPCode, LPCXSTR lpszMSGBuffer) -{ - return m_ProtocolPacket.ProtocolModule_Packet_HTTPCommon(ptszMsgBuffer, pInt_MsgLen, nHTTPCode, lpszMSGBuffer); -} extern "C" bool ProtocolModule_Packet_MQNumber(XENGINE_PROTOCOLHDR * pSt_ProtocolHdr, XENGINE_MQNUMBER * pSt_MQNumber, XCHAR * ptszMsgBuffer, int* pInt_MsgLen, int nNetType) { return m_ProtocolPacket.ProtocolModule_Packet_MQNumber(pSt_ProtocolHdr, pSt_MQNumber, ptszMsgBuffer, pInt_MsgLen, nNetType); diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 6a0f2ea..48a7e01 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -23,21 +23,21 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; if (!ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, &st_UserInfo)) { - ProtocolModule_Packet_HTTPCommon(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + 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_UserQuery(&st_UserInfo)) { - ProtocolModule_Packet_HTTPCommon(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_EXISTED, _X("user is existed")); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_EXISTED, _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; } if (!DBModule_MQUser_UserInsert(&st_UserInfo)) { - ProtocolModule_Packet_HTTPCommon(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_SERVICE, _X("service is failure")); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_SERVICE, _X("service is 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; @@ -55,7 +55,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP if (200 != nHTTPCode) { DBModule_MQUser_UserDelete(&st_UserInfo); //删除 - ProtocolModule_Packet_HTTPCommon(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_APIREG, _X("service is failure")); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_APIREG, _X("service is failure")); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求远程注册失败,HTTPCode:%d"), lpszClientAddr, nHTTPCode); return false; @@ -75,7 +75,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP消息端:%s,绑定消息队列主题失败,主题名称:%s,错误:%lX"), lpszClientAddr, st_Userkey.tszKeyName, DBModule_GetLastError()); } } - ProtocolModule_Packet_HTTPCommon(tszSDBuffer, &nSDLen); + 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, st_UserInfo.tszUserName, st_UserInfo.tszUserPass); } @@ -84,14 +84,14 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; if (!ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, &st_UserInfo)) { - ProtocolModule_Packet_HTTPCommon(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + 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_HTTPCommon(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_DELETE, _X("delete user failure")); + 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; @@ -108,7 +108,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XPass.tszPassUNReg, tszSDBuffer, &nHTTPCode, NULL, NULL, NULL, NULL, &st_HTTPParament); if (200 != nHTTPCode) { - ProtocolModule_Packet_HTTPCommon(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_APIDEL, _X("delete user failure")); + 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); } @@ -124,7 +124,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP DBModule_MQUser_KeyDelete(&st_UserKey); DBModule_MQUser_OwnerDelete(&st_DBOwner); - ProtocolModule_Packet_HTTPCommon(tszSDBuffer, &nSDLen); + 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); } From 07eac2aef4487e608dcf763cda43ffd4bc8dd05b Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 21 May 2025 17:30:29 +0800 Subject: [PATCH 13/28] modify:adjust http authorize method.now it use token instead with get modify:just post verification --- .../MQCore_ProtocolModule.def | 5 +- .../ProtocolModule_Parse.cpp | 157 ++++++++++++++++ .../ProtocolModule_Parse.h | 3 + .../MQCore_ProtocolModule/Protocol_Define.h | 74 +++++++- XEngine_Source/MQCore_ProtocolModule/pch.cpp | 12 ++ XEngine_Source/XEngine_MQServiceApp.sln | 1 + .../MQService_HTTPTask/MQService_HTTPGet.cpp | 168 +++++++----------- .../MQService_HTTPTask/MQService_HTTPGet.h | 2 +- .../MQService_HttpTask.cpp | 45 ++--- 9 files changed, 332 insertions(+), 135 deletions(-) diff --git a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def index 6944062..f0d3201 100644 --- a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def +++ b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def @@ -18,4 +18,7 @@ EXPORTS ProtocolModule_Packet_UNReadDelete ProtocolModule_Parse_Websocket - ProtocolModule_Parse_Register \ No newline at end of file + ProtocolModule_Parse_Register + ProtocolModule_Parse_Token + ProtocolModule_Parse_Type + ProtocolModule_Parse_Name \ 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 f17de8d..c5267aa 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp @@ -301,5 +301,162 @@ bool CProtocolModule_Parse::ProtocolModule_Parse_Register(LPCXSTR lpszMsgBuffer, { pSt_UserInfo->nUserState = st_JsonProtocol["nUserState"].asInt(); } + return true; +} +/******************************************************************** +函数名称:ProtocolModule_Parse_Token +函数功能:解析TOKEN + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入要解析的大小 + 参数.三:pxhToken + In/Out:Out + 类型:句柄 + 可空:N + 意思:输出解析到的TOKEN值 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CProtocolModule_Parse::ProtocolModule_Parse_Token(LPCXSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE* pxhToken) +{ + Protocol_IsErrorOccur = false; + + if ((NULL == lpszMsgBuffer) || (NULL == pxhToken)) + { + 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; + } + if (st_JsonRoot["xhToken"].isNull()) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARSE; + return false; + } + *pxhToken = st_JsonRoot["xhToken"].asUInt64(); + return true; +} +/******************************************************************** +函数名称:ProtocolModule_Parse_Type +函数功能:解析负载的类型字段 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:pInt_Type + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出解析到的类型 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CProtocolModule_Parse::ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int nMsgLen, int* pInt_Type) +{ + 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["nType"].isNull()) + { + *pInt_Type = st_JsonObject["nType"].asInt(); + } + + return true; +} +/******************************************************************** +函数名称:ProtocolModule_Parse_Name +函数功能:解析负载的类型字段 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:ptszMSGBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出解析到的名称 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CProtocolModule_Parse::ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszMSGBuffer) +{ + 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["name"].isNull()) + { + _tcsxcpy(ptszMSGBuffer, st_JsonObject["name"].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 bda97c7..d503748 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h @@ -19,6 +19,9 @@ class CProtocolModule_Parse public: bool ProtocolModule_Parse_Websocket(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XCHAR* ptszMsgBuffer, int* pInt_MsgLen); 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); protected: private: }; diff --git a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h index 1962946..1bdc723 100644 --- a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h +++ b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h @@ -459,4 +459,76 @@ extern "C" bool ProtocolModule_Parse_Websocket(LPCXSTR lpszMsgBuffer, int nMsgLe 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ProtocolModule_Parse_Register(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERINFO* pSt_UserInfo); \ No newline at end of file +extern "C" bool ProtocolModule_Parse_Register(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERINFO* pSt_UserInfo); +/******************************************************************** +函数名称:ProtocolModule_Parse_Token +函数功能:解析TOKEN + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入要解析的大小 + 参数.三:pxhToken + In/Out:Out + 类型:句柄 + 可空:N + 意思:输出解析到的TOKEN值 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ProtocolModule_Parse_Token(LPCXSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE* pxhToken); +/******************************************************************** +函数名称:ProtocolModule_Parse_Type +函数功能:解析负载的类型字段 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:pInt_Type + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出解析到的类型 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int nMsgLen, int* pInt_Type); +/******************************************************************** +函数名称:ProtocolModule_Parse_Name +函数功能:解析负载的类型字段 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:ptszMSGBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出解析到的名称 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszMSGBuffer); \ No newline at end of file diff --git a/XEngine_Source/MQCore_ProtocolModule/pch.cpp b/XEngine_Source/MQCore_ProtocolModule/pch.cpp index 1fc2235..ee4b5f7 100644 --- a/XEngine_Source/MQCore_ProtocolModule/pch.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/pch.cpp @@ -93,4 +93,16 @@ extern "C" bool ProtocolModule_Parse_Websocket(LPCXSTR lpszMsgBuffer, int nMsgLe extern "C" bool ProtocolModule_Parse_Register(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERINFO* pSt_UserInfo) { return m_ProtocolParse.ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, pSt_UserInfo); +} +extern "C" bool ProtocolModule_Parse_Token(LPCXSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE* pxhToken) +{ + return m_ProtocolParse.ProtocolModule_Parse_Token(lpszMsgBuffer, nMsgLen, pxhToken); +} +extern "C" bool ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int nMsgLen, int* pInt_Type) +{ + return m_ProtocolParse.ProtocolModule_Parse_Type(lpszMsgBuffer, nMsgLen, pInt_Type); +} +extern "C" bool ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszMSGBuffer) +{ + return m_ProtocolParse.ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, ptszMSGBuffer); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp.sln b/XEngine_Source/XEngine_MQServiceApp.sln index 2ecbe3b..389dc75 100644 --- a/XEngine_Source/XEngine_MQServiceApp.sln +++ b/XEngine_Source/XEngine_MQServiceApp.sln @@ -11,6 +11,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_MQServiceApp", "XEn {77321E0D-15DB-4C6E-8872-115CBBE41F27} = {77321E0D-15DB-4C6E-8872-115CBBE41F27} {8C55D3E0-FEC2-4A6C-A374-651516ED8F99} = {8C55D3E0-FEC2-4A6C-A374-651516ED8F99} {B0EB2A7A-53C1-4E9F-A851-19539099671C} = {B0EB2A7A-53C1-4E9F-A851-19539099671C} + {E17E889F-D826-413F-854E-DBA6000B4DA7} = {E17E889F-D826-413F-854E-DBA6000B4DA7} {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} = {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} {F6520D2C-BB8E-45BB-964B-F5D6A4318A89} = {F6520D2C-BB8E-45BB-964B-F5D6A4318A89} EndProjectSection diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp index dedf631..36c02d2 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp @@ -10,128 +10,94 @@ // Purpose: HTTP GET方法处理 // History: *********************************************************************/ -bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LPCXSTR lpszMsgBuffer, int nMsgLen, int nMethodPos, XCHAR*** pptszListHdr, int nUrlCount) +bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, XCHAR*** pptszListHdr, int nUrlCount) { int nSDLen = 0; XCHAR tszSDBuffer[1024] = {}; XCHAR tszKeyStr[MAX_PATH] = {}; - XCHAR tszVluStr[MAX_PATH] = {}; - LPCXSTR lpszAPIGet = _X("get"); - LPCXSTR lpszAPIUser = _X("user"); - LPCXSTR lpszAPITopic = _X("topic"); - LPCXSTR lpszAPIOnline = _X("online"); - LPCXSTR lpszAPIDelete = _X("delete"); - - if (0 == _tcsxnicmp(lpszAPIUser, lpszFuncName, _tcsxlen(lpszAPIUser))) - { - //用户 http://127.0.0.1:5202/api?function=user&token=0 - int nListCount = 0; - XENGINE_PROTOCOL_USERINFO** ppSt_UserInfo; - DBModule_MQUser_UserList(&ppSt_UserInfo, &nListCount); - ProtocolModule_Packet_UserList(tszSDBuffer, &nSDLen, &ppSt_UserInfo, nListCount); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - 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(lpszAPIOnline, lpszFuncName, _tcsxlen(lpszAPIOnline))) - { - //获取在线用户 http://127.0.0.1:5202/api?function=online&token=0&type=0 - int nListCount = 0; - XCHAR** pptszListAddr; - BaseLib_String_GetKeyValue((*pptszListHdr)[nMethodPos + 1], _X("="), tszKeyStr, tszVluStr); - SessionModule_Client_GetListAddr(&pptszListAddr, &nListCount, _ttxoi(tszVluStr)); - 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 == _tcsxnicmp(lpszAPITopic, lpszFuncName, _tcsxlen(lpszAPITopic))) + LPCXSTR lpszAPILogin = _X("login"); + LPCXSTR lpszAPIUPDate = _X("update"); + LPCXSTR lpszAPIClose = _X("close"); + + if (0 == _tcsxnicmp(lpszAPILogin, lpszFuncName, _tcsxlen(lpszAPILogin))) { - //主题 http://127.0.0.1:5202/api?function=topic&name=comm - if (2 == nUrlCount) + //http://app.xyry.org:5202/api?function=login&user=123123aa&pass=123123 + XNETHANDLE xhToken = 0; + XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; + + BaseLib_String_GetKeyValue((*pptszListHdr)[1], "=", tszKeyStr, st_UserInfo.tszUserName); + BaseLib_String_GetKeyValue((*pptszListHdr)[2], "=", tszKeyStr, st_UserInfo.tszUserPass); + + if (!DBModule_MQUser_UserQuery(&st_UserInfo)) { - int nListCount = 0; - XCHAR** ppszTableName; - DBModule_MQData_ShowTable(&ppszTableName, &nListCount); - ProtocolModule_Packet_TopicList(tszSDBuffer, &nSDLen, &ppszTableName, nListCount); - BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, "user or pass is incorrect"); 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_ERROR, _X("HTTP客户端:%s,请求本地验证失败,用户或者密码不正确,错误:%lX"), lpszClientAddr, SessionModule_GetLastError()); + return false; } - else + //用户是否存在会话,存在就返回,并且更新TOKEN + if (Session_Token_GetUser(st_UserInfo.tszUserName, st_UserInfo.tszUserPass, &xhToken)) { - int nDBCount = 0; - BaseLib_String_GetKeyValue((*pptszListHdr)[nMethodPos + 1], _X("="), tszKeyStr, tszVluStr); - DBModule_MQData_GetLeftCount(tszVluStr, 0, &nDBCount); - ProtocolModule_Packet_TopicName(tszSDBuffer, &nSDLen, tszVluStr, nDBCount); + XCHAR tszTokenStr[128] = {}; + _xstprintf(tszTokenStr, _X("%lld"), xhToken); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, 0, tszTokenStr); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取主题列表请求成功,获取到的主题消息个数:%d"), lpszClientAddr, nDBCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求登录发现会话已经存在,直接返回TOKEN:%lld 成功"), lpszClientAddr, xhToken); + return true; } - } - else if (0 == _tcsxnicmp(lpszAPIDelete, lpszFuncName, _tcsxlen(lpszAPIDelete))) - { - //http://127.0.0.1:5202/api?function=delete&type=0&name=comm - BaseLib_String_GetKeyValue((*pptszListHdr)[nMethodPos + 2], _X("="), tszKeyStr, tszVluStr); - if (0 == _ttxoi(tszVluStr)) + //权限是否正确 + if (0 != st_UserInfo.nUserLevel) { - //type = 0 删除主题 - memset(tszVluStr, '\0', sizeof(tszVluStr)); - BaseLib_String_GetKeyValue((*pptszListHdr)[nMethodPos + 3], _X("="), tszKeyStr, tszVluStr); - - XENGINE_DBTOPICOWNER st_DBOwner = {}; - XENGINE_DBUSERKEY st_UserKey = {}; - XENGINE_DBTIMERELEASE st_DBInfo = {}; - - _tcsxcpy(st_DBOwner.tszQueueName, tszVluStr); - _tcsxcpy(st_UserKey.tszKeyName, tszVluStr); - _tcsxcpy(st_DBInfo.tszQueueName, tszVluStr); - if (!DBModule_MQUser_OwnerDelete(&st_DBOwner)) - { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, "topic name not found"); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求HTTP删除主题失败,主题不存在:%s"), lpszClientAddr, tszVluStr); - return false; - } - //清楚数据库 - APIHelp_Counter_SerialDel(tszVluStr); - DBModule_MQData_DeleteTable(tszVluStr); - DBModule_MQUser_KeyDelete(&st_UserKey); - DBModule_MQUser_TimeDelete(&st_DBInfo); - - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + 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_INFO, _X("HTTP客户端:%s,请求主题删除成功,主题名:%s"), lpszClientAddr, tszVluStr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户名:%s,登录失败,客户端权限不足够"), lpszClientAddr, st_UserInfo.tszUserName); + return false; } - else + if (0 == xhToken) { - // 删除用户 - memset(tszVluStr, '\0', sizeof(tszVluStr)); - BaseLib_String_GetKeyValue((*pptszListHdr)[nMethodPos + 3], _X("="), tszKeyStr, tszVluStr); - - XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; - XENGINE_DBUSERKEY st_UserKey = {}; - XENGINE_DBTOPICOWNER st_DBOwner = {}; + BaseLib_Handle_Create(&xhToken); + } + Session_Token_Insert(xhToken, &st_UserInfo); - _tcsxcpy(st_UserInfo.tszUserName, tszVluStr); - _tcsxcpy(st_UserKey.tszUserName, tszVluStr); - _tcsxcpy(st_DBOwner.tszUserName, tszVluStr); + XCHAR tszTokenStr[128] = {}; + _xstprintf(tszTokenStr, _X("%lld"), xhToken); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, 0, tszTokenStr); + 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))) + { + //http://app.xyry.org:5202/api?function=update&token=1000112345 + XCHAR tszUserToken[128]; + memset(tszUserToken, '\0', sizeof(tszUserToken)); - if (!DBModule_MQUser_UserQuery(&st_UserInfo)) - { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, "user name not found"); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求HTTP删除用户失败,用户不存在:%s"), lpszClientAddr, st_UserInfo.tszUserName); - return false; - } - DBModule_MQUser_UserDelete(&st_UserInfo); - DBModule_MQUser_KeyDelete(&st_UserKey); - DBModule_MQUser_OwnerDelete(&st_DBOwner); + BaseLib_String_GetKeyValue((*pptszListHdr)[1], "=", tszKeyStr, tszUserToken); - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + if (!Session_Token_UPDate(_ttxoll(tszUserToken))) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, "token not found"); 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); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,更新TOKEN失败,不存在的Token:%s"), lpszClientAddr, tszUserToken); + return false; } + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, 0, tszUserToken); + 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))) + { + //http://app.xyry.org:5202/api?function=close&token=1000112345 + XCHAR tszUserToken[128]; + memset(tszUserToken, '\0', sizeof(tszUserToken)); + + BaseLib_String_GetKeyValue((*pptszListHdr)[1], "=", tszKeyStr, tszUserToken); + //主动关闭 + Session_Token_Delete(_ttxoll(tszUserToken)); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, 0, tszUserToken); + 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); } + return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.h b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.h index 8fcfdd3..cff58c1 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.h +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.h @@ -10,4 +10,4 @@ // Purpose: HTTP GET方法处理 // History: *********************************************************************/ -bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LPCXSTR lpszMsgBuffer, int nMsgLen, int nMethodPos, XCHAR*** pptszListHdr, int nUrlCount); \ No newline at end of file +bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, XCHAR*** pptszListHdr, int nUrlCount); \ 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 480db3b..ed80bd7 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp @@ -58,48 +58,31 @@ bool MessageQueue_Http_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求HTTP管理接口失败,参数错误:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); return false; } - int nMethodPos = 0; - //判断是否需要验证 - if (st_ServiceCfg.st_XAuthorize.bHTTPAuth) + //判断请求 + if (0 == _tcsxnicmp(lpszPostMethod, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszPostMethod))) { - //http://127.0.0.1:5202/api?function=user&auth=XENGINE_MQPasskey - BaseLib_String_GetKeyValue(ppSt_ListUrl[1], _X("="), tszKey, tszValue); - if (_tcsxlen(st_ServiceCfg.st_XAuthorize.tszHTTPPass) > 0) - { - int nHTTPCode = 0; - ProtocolModule_Packet_PassHttp(tszPKTBuffer, &nPKTLen, pptszListHdr[1], pptszListHdr[0], pSt_HTTPParam->tszHttpMethod); - APIClient_Http_Request("POST", st_ServiceCfg.st_XAuthorize.tszHTTPPass, tszPKTBuffer, &nHTTPCode); - if (200 != nHTTPCode) - { - ProtocolModule_Packet_Http(tszPKTBuffer, &nPKTLen, ERROR_XENGINE_MESSAGE_HTTP_AUTHORIZE, "auth key is incorrent"); - XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求HTTP管理接口失败,验证失败:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - return false; - } - } - else + //判断是否需要验证 + if (st_ServiceCfg.st_XAuthorize.bHTTPAuth) { - if (0 != _tcsxncmp(st_ServiceCfg.st_XAuthorize.tszToken, tszValue, _tcsxlen(st_ServiceCfg.st_XAuthorize.tszToken))) + XNETHANDLE xhToken = 0; + if (ProtocolModule_Parse_Token(lpszMsgBuffer, nMsgLen, &xhToken)) { - ProtocolModule_Packet_Http(tszPKTBuffer, &nPKTLen, ERROR_XENGINE_MESSAGE_HTTP_AUTHORIZE, "auth key is incorrent"); - XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求HTTP管理接口失败,验证失败:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - return false; + if (!Session_Token_Get(xhToken)) + { + ProtocolModule_Packet_Http(tszPKTBuffer, &nPKTLen, ERROR_XENGINE_MESSAGE_HTTP_AUTHORIZE, "not authorize"); + XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求的API:%s 失败,因为没有经过验证"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return false; + } } } - nMethodPos++; - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求HTTP管理接口验证成功,验证TOKEN:%s"), lpszClientAddr, ppSt_ListUrl[1]); - } - //判断请求 - if (0 == _tcsxnicmp(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))) { BaseLib_String_GetKeyValue(ppSt_ListUrl[0], _X("="), tszKey, tszValue); - MessageQueue_HttpTask_Get(lpszClientAddr, tszValue, lpszMsgBuffer, nMsgLen, nMethodPos, &ppSt_ListUrl, nUrlCount); + MessageQueue_HttpTask_Get(lpszClientAddr, tszValue, &ppSt_ListUrl, nUrlCount); } else { From 8ad6a0f83938a48dbec3017950c25c12eb1d5223 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 21 May 2025 17:32:33 +0800 Subject: [PATCH 14/28] modify:http request info api to post and post verification modify:The http protocol distinguishes the API's get information --- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 89 ++++++++++++++++++- 1 file changed, 86 insertions(+), 3 deletions(-) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 48a7e01..45dc2c3 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -14,9 +14,15 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP { int nSDLen = 0; XCHAR tszSDBuffer[1024] = {}; + XCHAR tszKeyStr[MAX_PATH] = {}; + XCHAR tszVluStr[MAX_PATH] = {}; LPCXSTR lpszAPIRegister = _X("register"); - LPCXSTR lpszAPIDelete = _X("delete"); - + LPCXSTR lpszAPIGetUser = _X("getuser"); + LPCXSTR lpszAPIGetTopic = _X("gettopic"); + LPCXSTR lpszAPIGetList = _X("getlist"); + LPCXSTR lpszAPIGetOnline = _X("getonline"); + LPCXSTR lpszAPIDelTopic = _X("deltopic"); + LPCXSTR lpszAPIDelUser = _X("deluser"); //判断请求 if (0 == _tcsxnicmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister))) { @@ -79,7 +85,84 @@ 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(lpszAPIDelete, lpszFuncName, _tcsxlen(lpszAPIDelete))) + else if (0 == _tcsxnicmp(lpszAPIGetUser, lpszFuncName, _tcsxlen(lpszAPIGetUser))) + { + //用户 http://127.0.0.1:5202/api?function=getuser + int nListCount = 0; + XENGINE_PROTOCOL_USERINFO** ppSt_UserInfo; + DBModule_MQUser_UserList(&ppSt_UserInfo, &nListCount); + ProtocolModule_Packet_UserList(tszSDBuffer, &nSDLen, &ppSt_UserInfo, nListCount); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + 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))) + { + //获取在线用户 http://127.0.0.1:5202/api?function=getonline + int nType = 0; + int nListCount = 0; + XCHAR** pptszListAddr; + + ProtocolModule_Parse_Type(lpszMsgBuffer, nMsgLen, &nType); + 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,类型:%d"), lpszClientAddr, nListCount, nType); + } + else if (0 == _tcsxnicmp(lpszAPIGetTopic, lpszFuncName, _tcsxlen(lpszAPIGetTopic))) + { + //主题 http://127.0.0.1:5202/api?function=gettopic + int nDBCount = 0; + XCHAR tszTopicName[MAX_PATH] = {}; + ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, tszTopicName); + DBModule_MQData_GetLeftCount(tszTopicName, 0, &nDBCount); + ProtocolModule_Packet_TopicName(tszSDBuffer, &nSDLen, tszTopicName, nDBCount); + 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, tszTopicName, nDBCount); + } + else if (0 == _tcsxnicmp(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 == _tcsxnicmp(lpszAPIDelTopic, lpszFuncName, _tcsxlen(lpszAPIDelTopic))) + { + //http://127.0.0.1:5202/api?function=deltopic + XENGINE_DBTOPICOWNER st_DBOwner = {}; + XENGINE_DBUSERKEY st_UserKey = {}; + XENGINE_DBTIMERELEASE st_DBInfo = {}; + + XCHAR tszTopicName[MAX_PATH] = {}; + ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, tszTopicName); + + _tcsxcpy(st_DBOwner.tszQueueName, tszTopicName); + _tcsxcpy(st_UserKey.tszKeyName, tszTopicName); + _tcsxcpy(st_DBInfo.tszQueueName, tszTopicName); + if (!DBModule_MQUser_OwnerDelete(&st_DBOwner)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, "topic name not found"); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求HTTP删除主题失败,主题不存在:%s"), lpszClientAddr, tszTopicName); + return false; + } + //清楚数据库 + APIHelp_Counter_SerialDel(tszTopicName); + DBModule_MQData_DeleteTable(tszTopicName); + 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, tszTopicName); + } + else if (0 == _tcsxnicmp(lpszAPIDelUser, lpszFuncName, _tcsxlen(lpszAPIDelUser))) { XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; if (!ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, &st_UserInfo)) From 8824ae75571bca73e89fd3c2f703b33cf1ff0e8c Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 23 May 2025 10:50:06 +0800 Subject: [PATCH 15/28] fixed:build failure --- XEngine_Source/Makefile | 9 ++++++++- XEngine_Source/XEngine_MQServiceApp/Makefile | 6 +++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index 36e086e..8277a03 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -5,6 +5,7 @@ FLAGS= #要编译的模块 BASE_THIRDPART_JSONCPP = ./XEngine_Depend/XEngine_Module/jsoncpp BASE_THIRDPART_REPORT = ./XEngine_Depend/XEngine_Module/XEngine_InfoReport +BASE_THIRDPART_TOKEN = ./XEngine_Depend/XEngine_Module/XEngine_Token BASE_CONFIG_PATH = ./MQCore_ConfigModule BASE_PROTOCOL_PATH = ./MQCore_ProtocolModule @@ -21,7 +22,7 @@ else ifeq ($(PLATFORM),mac) FILEEXT = dylib endif -XENGINE_MODULES = libjsoncpp.so libXEngine_InfoReport.so \ +XENGINE_MODULES = libjsoncpp.so libXEngine_InfoReport.so libXEngine_Token.so \ libMQCore_ConfigModule.so libMQCore_ProtocolModule.so libMQCore_SessionModule.so libMQCore_MemoryCache.so libMQCore_DBModule.so libMQCore_HelpModule.so \ XEngine_MQServiceApp.exe @@ -41,6 +42,12 @@ ifeq ($(FLAGS), InstallAll) else make -C $(BASE_THIRDPART_REPORT) PLATFORM=$(PLATFORM) $(FLAGS) endif +libXEngine_Token.so: +ifeq ($(FLAGS), InstallAll) + cp $(BASE_THIRDPART_REPORT)/libXEngine_Token.$(FILEEXT) ../XEngine_Release/ +else + make -C $(BASE_THIRDPART_REPORT) PLATFORM=$(PLATFORM) $(FLAGS) +endif libMQCore_ConfigModule.so: make -C $(BASE_CONFIG_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) diff --git a/XEngine_Source/XEngine_MQServiceApp/Makefile b/XEngine_Source/XEngine_MQServiceApp/Makefile index 00e42ad..67f1521 100644 --- a/XEngine_Source/XEngine_MQServiceApp/Makefile +++ b/XEngine_Source/XEngine_MQServiceApp/Makefile @@ -2,10 +2,10 @@ CC = g++ -Wall -std=c++20 PLATVER = LOADHDR = -I ./ LOADSO = -L ../MQCore_ConfigModule -L ../MQCore_ProtocolModule -L ../MQCore_SessionModule -L ../MQCore_MemoryCache -L ../MQCore_DBModule -L ../MQCore_HelpModule \ - -L ../XEngine_Depend/XEngine_Module/jsoncpp -L ../XEngine_Depend/XEngine_Module/XEngine_InfoReport + -L ../XEngine_Depend/XEngine_Module/jsoncpp -L ../XEngine_Depend/XEngine_Module/XEngine_InfoReport -L ../XEngine_Depend/XEngine_Module/XEngine_Token LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXClient_APIHelp -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 + -lMQCore_ConfigModule -lMQCore_ProtocolModule -lMQCore_SessionModule -lMQCore_MemoryCache -lMQCore_DBModule -lMQCore_HelpModule \ + -ljsoncpp -lXEngine_InfoReport -lXEngine_Token LIBEX = OBJECTS = MQService_Net.o MQService_Config.o MQService_TCPTask.o MQService_HttpTask.o MQService_WSTask.o MQService_Task.o MQService_MQTTTask.o MQService_HTTPPost.o MQService_HTTPGet.o XEngine_MQServiceApp.o From 884710041ebceb46a5cd7a0852447e7734c2ca01 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 23 May 2025 10:58:04 +0800 Subject: [PATCH 16/28] fixed:build dir --- XEngine_Source/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index 8277a03..653611d 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -44,9 +44,9 @@ else endif libXEngine_Token.so: ifeq ($(FLAGS), InstallAll) - cp $(BASE_THIRDPART_REPORT)/libXEngine_Token.$(FILEEXT) ../XEngine_Release/ + cp $(BASE_THIRDPART_TOKEN)/libXEngine_Token.$(FILEEXT) ../XEngine_Release/ else - make -C $(BASE_THIRDPART_REPORT) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_THIRDPART_TOKEN) PLATFORM=$(PLATFORM) $(FLAGS) endif libMQCore_ConfigModule.so: From 0a1ada03302d4ce8871b05b564ffc5390e41c74a Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 23 May 2025 11:03:50 +0800 Subject: [PATCH 17/28] update:depend library --- XEngine_Source/XEngine_Depend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend index 55c5d1a..b9427ac 160000 --- a/XEngine_Source/XEngine_Depend +++ b/XEngine_Source/XEngine_Depend @@ -1 +1 @@ -Subproject commit 55c5d1a2f22679d2daec1492fea98184cdbfc32f +Subproject commit b9427ac1eb1183eb76ae73c61b2cf0fb27448aa4 From 93bbb9fb8e11a14744ab5a6296affda2593891ec Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 23 May 2025 13:54:49 +0800 Subject: [PATCH 18/28] update:example and vs copy --- .../MQCore_HTTPApp/MQCore_HTTPApp.cpp | 95 ++++++++++++++-- .../MQCore_HTTPApp/MQCore_HTTPApp.vcxproj | 2 +- XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp | 102 ------------------ XEngine_Apps/VSCopy-x64.bat | 1 + XEngine_Apps/VSCopy-x86.bat | 1 + 5 files changed, 91 insertions(+), 110 deletions(-) diff --git a/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp b/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp index e8ca707..e196a8c 100644 --- a/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp +++ b/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -20,10 +21,32 @@ //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_UserRegister() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=register"); -void MQ_GetUserList() + Json::Value st_JsonRoot; + Json::Value st_JsonUser; + st_JsonUser["tszUserName"] = "123123aa"; + st_JsonUser["tszUserPass"] = "123123"; + st_JsonUser["tszEMailAddr"] = "xxx@ad.com"; + st_JsonUser["nPhoneNumber"] = 1369999999; + st_JsonUser["nIDNumber"] = 5111111111110; + st_JsonRoot["st_UserInfo"] = st_JsonUser; + 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_UserRegister:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} +void MQ_UserLogin() { - LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=get&method=user"); + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=login&user=123123aa&pass=123123"); int nLen = 0; XCHAR* ptszMsgBody = NULL; @@ -32,16 +55,69 @@ void MQ_GetUserList() _xtprintf("发送投递失败!\n"); return; } + 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(ptszMsgBody, ptszMsgBody + nLen, &st_JsonRoot, &st_JsonError)) + { + return; + } + xhToken = _ttxoll(st_JsonRoot["msg"].asCString()); + + _xtprintf("MQ_UserLogin:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} +void MQ_UserDelete() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=deluser"); + + Json::Value st_JsonRoot; + Json::Value st_JsonUser; + st_JsonUser["tszUserName"] = "123123aa"; + st_JsonUser["tszUserPass"] = "123123"; + st_JsonUser["tszEMailAddr"] = "xxx@ad.com"; + st_JsonUser["nPhoneNumber"] = 1369999999; + st_JsonUser["nIDNumber"] = 5111111111110; + st_JsonRoot["st_UserInfo"] = st_JsonUser; + 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_UserDelete:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} +void MQ_GetUserList() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=getuser"); + + Json::Value st_JsonRoot; + st_JsonRoot["xhToken"] = xhToken; + + 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_GetUserList:%s\n", ptszMsgBody); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); } void MQ_GetOnlineList() { - LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=get&method=online&type=0"); + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=getonline"); + + Json::Value st_JsonRoot; + st_JsonRoot["xhToken"] = xhToken; int nLen = 0; XCHAR* ptszMsgBody = NULL; - if (!APIClient_Http_Request(_X("GET"), lpszPostUrl, NULL, NULL, &ptszMsgBody, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszPostUrl, st_JsonRoot.toStyledString().c_str(), NULL, &ptszMsgBody, &nLen)) { _xtprintf("发送投递失败!\n"); return; @@ -51,11 +127,14 @@ void MQ_GetOnlineList() } void MQ_GetTopicList() { - LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=get&method=topic"); + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=getlist"); + + Json::Value st_JsonRoot; + st_JsonRoot["xhToken"] = xhToken; int nLen = 0; XCHAR* ptszMsgBody = NULL; - if (!APIClient_Http_Request(_X("GET"), lpszPostUrl, NULL, NULL, &ptszMsgBody, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszPostUrl, st_JsonRoot.toStyledString().c_str(), NULL, &ptszMsgBody, &nLen)) { _xtprintf("发送投递失败!\n"); return; @@ -71,10 +150,12 @@ int main() WSAStartup(MAKEWORD(2, 2), &st_WSAData); #endif + MQ_UserRegister(); + MQ_UserLogin(); MQ_GetUserList(); MQ_GetOnlineList(); MQ_GetTopicList(); - + MQ_UserDelete(); #ifdef _MSC_BUILD WSACleanup(); #endif diff --git a/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.vcxproj b/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.vcxproj index 28e53fe..37db60e 100644 --- a/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.vcxproj +++ b/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.vcxproj @@ -72,7 +72,7 @@ true - $(XEngine_Include);$(IncludePath) + $(XEngine_Include);../../XEngine_Source/XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) diff --git a/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp b/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp index 855630b..a6eaac5 100644 --- a/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp +++ b/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp @@ -28,57 +28,6 @@ LPCXSTR lpszKey = _X("XEngine_CommKey"); //主题 LPCXSTR lpszUser = _X("aaadddzxc"); LPCXSTR lpszPass = _X("123123"); -void MQ_Register() -{ - int nLen = 0; - XENGINE_PROTOCOLHDR st_ProtocolHdr; - XENGINE_PROTOCOL_USERINFO st_ProtocolInfo; - XCHAR tszMsgBuffer[2048]; - - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_ProtocolInfo, '\0', sizeof(XENGINE_PROTOCOL_USERINFO)); - - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_AUTH; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUSERREG; - st_ProtocolHdr.byVersion = 1; - st_ProtocolHdr.byIsReply = true; //获得处理返回结果 - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - st_ProtocolInfo.nUserLevel = 0; - st_ProtocolInfo.nUserState = 0; - st_ProtocolInfo.nPhoneNumber = 13699999999; - st_ProtocolInfo.nIDNumber = 511000000000101010; - strcpy(st_ProtocolInfo.tszUserName, lpszUser); - strcpy(st_ProtocolInfo.tszUserPass, lpszPass); - strcpy(st_ProtocolInfo.tszEMailAddr, "486179@qq.com"); - - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_USERINFO); - - nLen = sizeof(XENGINE_PROTOCOLHDR) + st_ProtocolHdr.unPacketSize; - memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_ProtocolInfo, sizeof(XENGINE_PROTOCOL_USERINFO)); - - if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - nLen = 0; - XCHAR* ptszMsgBuffer; - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - if (!XClient_TCPSelect_RecvPkt(m_Socket, &ptszMsgBuffer, &nLen, &st_ProtocolHdr)) - { - _xtprintf("接受数据失败!\n"); - return; - } - _xtprintf("%d\n", st_ProtocolHdr.wReserve); - if (nLen > 0) - { - BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); - } -} void MQ_Authorize() { int nLen = 0; @@ -177,55 +126,6 @@ void MQ_GetUNRead(int nType = 0) std::this_thread::sleep_for(std::chrono::milliseconds(1)); } } -//删除用户 -void MQ_DeleteUser() -{ - int nLen = 0; - XENGINE_PROTOCOLHDR st_ProtocolHdr; - XENGINE_PROTOCOL_USERINFO st_ProtocolInfo; - XCHAR tszMsgBuffer[2048]; - - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_ProtocolInfo, '\0', sizeof(XENGINE_PROTOCOL_USERINFO)); - - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_AUTH; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUSERDEL; - st_ProtocolHdr.byVersion = 1; - st_ProtocolHdr.byIsReply = true; - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_USERINFO); - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - st_ProtocolInfo.nUserLevel = 0; - st_ProtocolInfo.nUserState = 0; - st_ProtocolInfo.nPhoneNumber = 13699999999; - st_ProtocolInfo.nIDNumber = 511000000000101010; - strcpy(st_ProtocolInfo.tszUserName, lpszUser); - strcpy(st_ProtocolInfo.tszUserPass, lpszPass); - strcpy(st_ProtocolInfo.tszEMailAddr, "486179@qq.com"); - - nLen = sizeof(XENGINE_PROTOCOLHDR) + st_ProtocolHdr.unPacketSize; - memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_ProtocolInfo, sizeof(XENGINE_PROTOCOL_USERINFO)); - - 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)); - memcpy(&st_ProtocolHdr, tszMsgBuffer, sizeof(XENGINE_PROTOCOLHDR)); - - return; -} void MQ_Create() { @@ -628,7 +528,6 @@ int main(int argc, char** argv) } _xtprintf("连接成功!\n"); - MQ_Register(); MQ_Authorize(); MQ_GetUNRead(); MQ_Create(); @@ -647,7 +546,6 @@ int main(int argc, char** argv) MQ_Get(ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_STRING); MQ_TimePublish(); MQ_DeleteTopic(); - MQ_DeleteUser(); std::this_thread::sleep_for(std::chrono::seconds(1)); XClient_TCPSelect_Close(m_Socket); diff --git a/XEngine_Apps/VSCopy-x64.bat b/XEngine_Apps/VSCopy-x64.bat index 369235a..2cf0808 100644 --- a/XEngine_Apps/VSCopy-x64.bat +++ b/XEngine_Apps/VSCopy-x64.bat @@ -1,4 +1,5 @@ copy /y "%XEngine_Lib64%\XEngine_BaseLib\XEngine_BaseLib.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_BaseLib\XEngine_BaseSafe.dll" "./" copy /y "%XEngine_Lib64%\XEngine_BaseLib\XEngine_Algorithm.dll" "./" copy /y "%XEngine_Lib64%\XEngine_Core\XEngine_Cryption.dll" "./" copy /y "%XEngine_Lib64%\XEngine_Core\XEngine_ManagePool.dll" "./" diff --git a/XEngine_Apps/VSCopy-x86.bat b/XEngine_Apps/VSCopy-x86.bat index ece7865..da63b51 100644 --- a/XEngine_Apps/VSCopy-x86.bat +++ b/XEngine_Apps/VSCopy-x86.bat @@ -1,4 +1,5 @@ copy /y "%XEngine_Lib32%\XEngine_BaseLib\XEngine_BaseLib.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_BaseLib\XEngine_BaseSafe.dll" "./" copy /y "%XEngine_Lib32%\XEngine_BaseLib\XEngine_Algorithm.dll" "./" copy /y "%XEngine_Lib32%\XEngine_Core\XEngine_Cryption.dll" "./" copy /y "%XEngine_Lib32%\XEngine_Core\XEngine_ManagePool.dll" "./" From 261feed75852dea1fa680ac8fc1d07334733ffd9 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 23 May 2025 14:00:21 +0800 Subject: [PATCH 19/28] modify:adjust user register level --- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 1 + XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 45dc2c3..d3c8828 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -41,6 +41,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求用户注册失败,用户已经存在,错误:%lX"), lpszClientAddr, SessionModule_GetLastError()); return false; } + st_UserInfo.nUserLevel = ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_USER; if (!DBModule_MQUser_UserInsert(&st_UserInfo)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_SERVICE, _X("service is failure")); diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp index 168bc67..06a4df2 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp @@ -559,7 +559,7 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC 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()); + 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; From 2fa97542c309ea09b594f9dc15efb3b5e94c97bd Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 23 May 2025 14:09:50 +0800 Subject: [PATCH 20/28] modify:verification method and register not ver --- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 16 ++++++++++++++++ .../XEngine_MQServiceApp/MQService_HttpTask.cpp | 15 --------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index d3c8828..edfb8f0 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -23,6 +23,22 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP LPCXSTR lpszAPIGetOnline = _X("getonline"); LPCXSTR lpszAPIDelTopic = _X("deltopic"); LPCXSTR lpszAPIDelUser = _X("deluser"); + + //判断是否需要验证,不是注册协议 + if (st_ServiceCfg.st_XAuthorize.bHTTPAuth && (0 != _tcsxnicmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister)))) + { + XNETHANDLE xhToken = 0; + if (ProtocolModule_Parse_Token(lpszMsgBuffer, nMsgLen, &xhToken)) + { + if (!Session_Token_Get(xhToken)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_AUTHORIZE, "not authorize"); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求的API:%s 失败,因为没有经过验证"), lpszClientAddr, lpszFuncName); + return false; + } + } + } //判断请求 if (0 == _tcsxnicmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister))) { diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp index ed80bd7..7d43b8f 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp @@ -61,21 +61,6 @@ bool MessageQueue_Http_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST //判断请求 if (0 == _tcsxnicmp(lpszPostMethod, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszPostMethod))) { - //判断是否需要验证 - if (st_ServiceCfg.st_XAuthorize.bHTTPAuth) - { - XNETHANDLE xhToken = 0; - if (ProtocolModule_Parse_Token(lpszMsgBuffer, nMsgLen, &xhToken)) - { - if (!Session_Token_Get(xhToken)) - { - ProtocolModule_Packet_Http(tszPKTBuffer, &nPKTLen, ERROR_XENGINE_MESSAGE_HTTP_AUTHORIZE, "not authorize"); - XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求的API:%s 失败,因为没有经过验证"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - return false; - } - } - } BaseLib_String_GetKeyValue(ppSt_ListUrl[0], _X("="), tszKey, tszValue); MessageQueue_HttpTask_Post(lpszClientAddr, tszValue, lpszMsgBuffer, nMsgLen); } From f3d9a403aa3e65516a65c19b8ef1d4b359943acd Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 23 May 2025 15:04:11 +0800 Subject: [PATCH 21/28] added:create topic support for http modify:delete and create topic convert to tcp handle --- .../MQCore_HelpModule/APIHelp_Define.h | 19 ++++++- .../APIHelp_MQHelp/APIHelp_MQHelp.cpp | 49 ++++++++++++++++++ .../APIHelp_MQHelp/APIHelp_MQHelp.h | 23 +++++++++ .../MQCore_HelpModule/MQCore_HelpModule.def | 4 +- .../MQCore_HelpModule.vcxproj | 2 + .../MQCore_HelpModule.vcxproj.filters | 12 +++++ XEngine_Source/MQCore_HelpModule/Makefile | 4 +- XEngine_Source/MQCore_HelpModule/pch.cpp | 9 ++++ XEngine_Source/MQCore_HelpModule/pch.h | 1 + .../MQService_HTTPTask/MQService_HTTPPost.cpp | 51 ++++++++++--------- 10 files changed, 146 insertions(+), 28 deletions(-) create mode 100644 XEngine_Source/MQCore_HelpModule/APIHelp_MQHelp/APIHelp_MQHelp.cpp create mode 100644 XEngine_Source/MQCore_HelpModule/APIHelp_MQHelp/APIHelp_MQHelp.h diff --git a/XEngine_Source/MQCore_HelpModule/APIHelp_Define.h b/XEngine_Source/MQCore_HelpModule/APIHelp_Define.h index a152dbe..b011c37 100644 --- a/XEngine_Source/MQCore_HelpModule/APIHelp_Define.h +++ b/XEngine_Source/MQCore_HelpModule/APIHelp_Define.h @@ -68,4 +68,21 @@ extern "C" bool APIHelp_Counter_SerialGet(LPCXSTR lpszQueueName, __int64x* pInt_ 意思:是否成功 备注: *********************************************************************/ -extern "C" bool APIHelp_Counter_SerialDel(LPCXSTR lpszQueueName); \ No newline at end of file +extern "C" bool APIHelp_Counter_SerialDel(LPCXSTR lpszQueueName); +/************************************************************************* + 通用帮助函数导出 +**************************************************************************/ +/******************************************************************** +函数名称:APIHelp_MQHelp_ProtocolToHex +函数功能:协议转二进制 + 参数.一:pSt_ProtocolHdr + In/Out:In/Out + 类型:数据结构指针 + 可空:N + 意思:打包的协议 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool APIHelp_MQHelp_JsonToHex(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr); \ No newline at end of file diff --git a/XEngine_Source/MQCore_HelpModule/APIHelp_MQHelp/APIHelp_MQHelp.cpp b/XEngine_Source/MQCore_HelpModule/APIHelp_MQHelp/APIHelp_MQHelp.cpp new file mode 100644 index 0000000..a370868 --- /dev/null +++ b/XEngine_Source/MQCore_HelpModule/APIHelp_MQHelp/APIHelp_MQHelp.cpp @@ -0,0 +1,49 @@ +#include "pch.h" +#include "APIHelp_MQHelp.h" +/******************************************************************** +// Created: 2025/05/23 14:16:56 +// File Name: D:\XEngine_MQService\XEngine_Source\MQCore_HelpModule\APIHelp_MQHelp\APIHelp_MQHelp.cpp +// File Path: D:\XEngine_MQService\XEngine_Source\MQCore_HelpModule\APIHelp_MQHelp +// File Base: APIHelp_MQHelp +// File Ext: cpp +// Project: XEngine +// Author: qyt +// Purpose: 通用帮助函数 +// History: +*********************************************************************/ +CAPIHelp_MQHelp::CAPIHelp_MQHelp() +{ +} +CAPIHelp_MQHelp::~CAPIHelp_MQHelp() +{ + +} +////////////////////////////////////////////////////////////////////////// +// 公有函数 +////////////////////////////////////////////////////////////////////////// +/******************************************************************** +函数名称:APIHelp_MQHelp_ProtocolToHex +函数功能:协议转二进制 + 参数.一:pSt_ProtocolHdr + In/Out:In/Out + 类型:数据结构指针 + 可空:N + 意思:打包的协议 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CAPIHelp_MQHelp::APIHelp_MQHelp_JsonToHex(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr) +{ + APIHelp_IsErrorOccur = false; + + pSt_ProtocolHdr->wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; + pSt_ProtocolHdr->byIsReply = true; + pSt_ProtocolHdr->byVersion = ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_BIN; + pSt_ProtocolHdr->unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; + pSt_ProtocolHdr->unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); + pSt_ProtocolHdr->wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; + + return true; +} \ No newline at end of file diff --git a/XEngine_Source/MQCore_HelpModule/APIHelp_MQHelp/APIHelp_MQHelp.h b/XEngine_Source/MQCore_HelpModule/APIHelp_MQHelp/APIHelp_MQHelp.h new file mode 100644 index 0000000..80212f4 --- /dev/null +++ b/XEngine_Source/MQCore_HelpModule/APIHelp_MQHelp/APIHelp_MQHelp.h @@ -0,0 +1,23 @@ +#pragma once +/******************************************************************** +// Created: 2025/05/23 14:16:30 +// File Name: D:\XEngine_MQService\XEngine_Source\MQCore_HelpModule\APIHelp_MQHelp\APIHelp_MQHelp.h +// File Path: D:\XEngine_MQService\XEngine_Source\MQCore_HelpModule\APIHelp_MQHelp +// File Base: APIHelp_MQHelp +// File Ext: h +// Project: XEngine +// Author: qyt +// Purpose: 通用帮助函数 +// History: +*********************************************************************/ + +class CAPIHelp_MQHelp +{ +public: + CAPIHelp_MQHelp(); + ~CAPIHelp_MQHelp(); +public: + bool APIHelp_MQHelp_JsonToHex(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr); +protected: +private: +}; \ No newline at end of file diff --git a/XEngine_Source/MQCore_HelpModule/MQCore_HelpModule.def b/XEngine_Source/MQCore_HelpModule/MQCore_HelpModule.def index bcadb6a..2185926 100644 --- a/XEngine_Source/MQCore_HelpModule/MQCore_HelpModule.def +++ b/XEngine_Source/MQCore_HelpModule/MQCore_HelpModule.def @@ -5,4 +5,6 @@ EXPORTS APIHelp_Counter_SerialSet APIHelp_Counter_SerialGet - APIHelp_Counter_SerialDel \ No newline at end of file + APIHelp_Counter_SerialDel + + APIHelp_MQHelp_JsonToHex \ No newline at end of file diff --git a/XEngine_Source/MQCore_HelpModule/MQCore_HelpModule.vcxproj b/XEngine_Source/MQCore_HelpModule/MQCore_HelpModule.vcxproj index bc15647..b3a8417 100644 --- a/XEngine_Source/MQCore_HelpModule/MQCore_HelpModule.vcxproj +++ b/XEngine_Source/MQCore_HelpModule/MQCore_HelpModule.vcxproj @@ -233,11 +233,13 @@ + + Create diff --git a/XEngine_Source/MQCore_HelpModule/MQCore_HelpModule.vcxproj.filters b/XEngine_Source/MQCore_HelpModule/MQCore_HelpModule.vcxproj.filters index cf7c225..6e10664 100644 --- a/XEngine_Source/MQCore_HelpModule/MQCore_HelpModule.vcxproj.filters +++ b/XEngine_Source/MQCore_HelpModule/MQCore_HelpModule.vcxproj.filters @@ -19,6 +19,12 @@ {75ffe4ca-a70b-4320-98d0-219b06839ac3} + + {0d962ca1-ecd7-42ec-a59d-8a9e2f8eb1d9} + + + {343456e5-68f5-4e4e-9e32-61b7e0418105} + @@ -36,6 +42,9 @@ 头文件 + + 头文件\APIHelp_MQHelp + @@ -47,6 +56,9 @@ 源文件\APIHelp_Counter + + 源文件\APIHelp_MQHelp + diff --git a/XEngine_Source/MQCore_HelpModule/Makefile b/XEngine_Source/MQCore_HelpModule/Makefile index 7da10c4..d2d60e0 100644 --- a/XEngine_Source/MQCore_HelpModule/Makefile +++ b/XEngine_Source/MQCore_HelpModule/Makefile @@ -6,7 +6,7 @@ LOADHDR = -I ./ LOADSO = LIB = LIBEX = -OBJECTS = APIHelp_Counter.o pch.o +OBJECTS = APIHelp_Counter.o APIHelp_MQHelp.o pch.o ifeq ($(RELEASE),1) FLAGS = -c -D _RELEASE @@ -52,6 +52,8 @@ all:$(OBJECTS) APIHelp_Counter.o:./APIHelp_Counter/APIHelp_Counter.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./APIHelp_Counter/APIHelp_Counter.cpp +APIHelp_MQHelp.o:./APIHelp_MQHelp/APIHelp_MQHelp.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./APIHelp_MQHelp/APIHelp_MQHelp.cpp pch.o:./pch.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp diff --git a/XEngine_Source/MQCore_HelpModule/pch.cpp b/XEngine_Source/MQCore_HelpModule/pch.cpp index bb3d233..6590cf4 100644 --- a/XEngine_Source/MQCore_HelpModule/pch.cpp +++ b/XEngine_Source/MQCore_HelpModule/pch.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include "APIHelp_Counter/APIHelp_Counter.h" +#include "APIHelp_MQHelp/APIHelp_MQHelp.h" /******************************************************************** // Created: 2025/03/11 14:51:51 // File Name: D:\XEngine_MQService\XEngine_Source\MQCore_HelpModule\pch.cpp @@ -15,6 +16,7 @@ bool APIHelp_IsErrorOccur = false; XLONG APIHelp_dwErrorCode = 0; ////////////////////////////////////////////////////////////////////////// CAPIHelp_Counter m_HelpCounter; +CAPIHelp_MQHelp m_MQHelp; ////////////////////////////////////////////////////////////////////////// // 导出的函数 ////////////////////////////////////////////////////////////////////////// @@ -40,4 +42,11 @@ extern "C" bool APIHelp_Counter_SerialGet(LPCXSTR lpszQueueName, __int64x* pInt_ extern "C" bool APIHelp_Counter_SerialDel(LPCXSTR lpszQueueName) { return m_HelpCounter.APIHelp_Counter_SerialDel(lpszQueueName); +} +/************************************************************************* + 通用帮助函数导出 +**************************************************************************/ +extern "C" bool APIHelp_MQHelp_JsonToHex(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr) +{ + return m_MQHelp.APIHelp_MQHelp_JsonToHex(pSt_ProtocolHdr); } \ No newline at end of file diff --git a/XEngine_Source/MQCore_HelpModule/pch.h b/XEngine_Source/MQCore_HelpModule/pch.h index 5efbc19..866cd14 100644 --- a/XEngine_Source/MQCore_HelpModule/pch.h +++ b/XEngine_Source/MQCore_HelpModule/pch.h @@ -21,6 +21,7 @@ #include #include #include +#include "../XQueue_ProtocolHdr.h" #include "APIHelp_Define.h" #include "APIHelp_Error.h" /******************************************************************** diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index edfb8f0..398c7ee 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -13,6 +13,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LPCXSTR lpszMsgBuffer, int nMsgLen) { int nSDLen = 0; + XNETHANDLE xhToken = 0; XCHAR tszSDBuffer[1024] = {}; XCHAR tszKeyStr[MAX_PATH] = {}; XCHAR tszVluStr[MAX_PATH] = {}; @@ -21,13 +22,13 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP LPCXSTR lpszAPIGetTopic = _X("gettopic"); LPCXSTR lpszAPIGetList = _X("getlist"); LPCXSTR lpszAPIGetOnline = _X("getonline"); + LPCXSTR lpszAPICreateTopic = _X("createtopic"); LPCXSTR lpszAPIDelTopic = _X("deltopic"); LPCXSTR lpszAPIDelUser = _X("deluser"); //判断是否需要验证,不是注册协议 if (st_ServiceCfg.st_XAuthorize.bHTTPAuth && (0 != _tcsxnicmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister)))) { - XNETHANDLE xhToken = 0; if (ProtocolModule_Parse_Token(lpszMsgBuffer, nMsgLen, &xhToken)) { if (!Session_Token_Get(xhToken)) @@ -149,35 +150,35 @@ 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))) + { + //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); + + 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_PROTOCOLHDR), 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))) { //http://127.0.0.1:5202/api?function=deltopic - XENGINE_DBTOPICOWNER st_DBOwner = {}; - XENGINE_DBUSERKEY st_UserKey = {}; - XENGINE_DBTIMERELEASE st_DBInfo = {}; - XCHAR tszTopicName[MAX_PATH] = {}; - ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, tszTopicName); + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + XENGINE_PROTOCOLHDR st_ProtocolHdr = {}; + + ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, st_MQProtocol.tszMQKey); + APIHelp_MQHelp_JsonToHex(&st_ProtocolHdr); - _tcsxcpy(st_DBOwner.tszQueueName, tszTopicName); - _tcsxcpy(st_UserKey.tszKeyName, tszTopicName); - _tcsxcpy(st_DBInfo.tszQueueName, tszTopicName); - if (!DBModule_MQUser_OwnerDelete(&st_DBOwner)) - { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, "topic name not found"); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求HTTP删除主题失败,主题不存在:%s"), lpszClientAddr, tszTopicName); - return false; - } - //清楚数据库 - APIHelp_Counter_SerialDel(tszTopicName); - DBModule_MQData_DeleteTable(tszTopicName); - 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, tszTopicName); + 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_PROTOCOLHDR), 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))) { From 2ff7fccade4011b88c216f82149386da309a76af Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 23 May 2025 15:04:40 +0800 Subject: [PATCH 22/28] modify:tcp task handle http type support --- .../ProtocolModule_Packet.cpp | 4 ++ .../MQService_TCPTask.cpp | 37 +++++++++++++------ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp index e3a11a6..cfdeb65 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp @@ -75,6 +75,10 @@ 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 06a4df2..b0d53ce 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp @@ -49,6 +49,10 @@ 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"); @@ -193,20 +197,27 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC } else if (ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ == pSt_ProtocolHdr->unOperatorType) { - XENGINE_PROTOCOL_XMQ st_MQProtocol; - XCHAR tszUserName[MAX_PATH]; - - memset(&st_MQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - memset(tszUserName, '\0', MAX_PATH); - - if (!SessionModule_Client_GetUser(lpszClientAddr, tszUserName)) + XCHAR tszUserName[MAX_PATH] = {}; + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + //根据协议处理 + if (XENGINE_MQAPP_NETTYPE_HTTP == nNetType) { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_AUTH_NOTLOGIN; - 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); - return false; + XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; + Session_Token_Get(pSt_ProtocolHdr->xhToken, &st_UserInfo); + _tcsxcpy(tszUserName, st_UserInfo.tszUserName); } + else + { + if (!SessionModule_Client_GetUser(lpszClientAddr, tszUserName)) + { + pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_AUTH_NOTLOGIN; + 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); + return false; + } + } + if (nMsgLen >= (int)sizeof(XENGINE_PROTOCOL_XMQ)) { memcpy(&st_MQProtocol, lpszMsgBuffer, sizeof(XENGINE_PROTOCOL_XMQ)); @@ -590,10 +601,12 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC 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)) { From 0f823f6a5dc2345284aa8de0c414eae576ef5467 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 23 May 2025 15:25:27 +0800 Subject: [PATCH 23/28] example update --- .../MQCore_HTTPApp/MQCore_HTTPApp.cpp | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp b/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp index e196a8c..22f52ca 100644 --- a/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp +++ b/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp @@ -125,6 +125,50 @@ void MQ_GetOnlineList() _xtprintf("MQ_GetOnlineList:%s\n", ptszMsgBody); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); } +void MQ_TopicCreate() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=createtopic"); + + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + + st_JsonObject["name"] = "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_TopicDelete() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=deletetopic"); + + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + + st_JsonObject["name"] = "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_TopicDelete:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} void MQ_GetTopicList() { LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=getlist"); @@ -154,7 +198,9 @@ int main() MQ_UserLogin(); MQ_GetUserList(); MQ_GetOnlineList(); + MQ_TopicCreate(); MQ_GetTopicList(); + MQ_TopicDelete(); MQ_UserDelete(); #ifdef _MSC_BUILD WSACleanup(); From f6df98e33b8cf293a80342dcf101713bf96b9829 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 23 May 2025 15:28:20 +0800 Subject: [PATCH 24/28] modify:delete topic and create topic issue and method name update:configure file --- XEngine_Release/XEngine_Config/XEngine_Config.json | 4 +--- XEngine_Source/MQCore_ConfigModule/Config_Define.h | 2 -- .../MQCore_ConfigModule/Config_Json/Config_Json.cpp | 4 +--- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 10 +++++----- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index 169ef61..2e64c81 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -43,9 +43,7 @@ "nTimeCount":0 }, "XAuthorize":{ - "bHTTPAuth":true, - "tszHTTPPass":"", - "tszToken":"MQPasskey" + "bHTTPAuth":true }, "XReport":{ "bEnable":true, diff --git a/XEngine_Source/MQCore_ConfigModule/Config_Define.h b/XEngine_Source/MQCore_ConfigModule/Config_Define.h index b90cca0..438f52f 100644 --- a/XEngine_Source/MQCore_ConfigModule/Config_Define.h +++ b/XEngine_Source/MQCore_ConfigModule/Config_Define.h @@ -67,8 +67,6 @@ typedef struct struct { bool bHTTPAuth; - XCHAR tszHTTPPass[MAX_PATH]; - XCHAR tszToken[MAX_PATH]; }st_XAuthorize; struct { diff --git a/XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp b/XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp index 27677c1..f6b7f8f 100644 --- a/XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp +++ b/XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp @@ -137,7 +137,7 @@ bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile,XENGINE_SERVERCONFIG pSt_ServerConfig->st_XMemory.nTimeLast = st_JsonXMemory["nTimeLast"].asInt(); pSt_ServerConfig->st_XMemory.nTimeCount = st_JsonXMemory["nTimeCount"].asInt(); - if (st_JsonRoot["XAuthorize"].empty() || (3 != st_JsonRoot["XAuthorize"].size())) + if (st_JsonRoot["XAuthorize"].empty() || (1 != st_JsonRoot["XAuthorize"].size())) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_MQ_MODULE_CONFIG_JSON_XAUTHORIZE; @@ -145,8 +145,6 @@ bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile,XENGINE_SERVERCONFIG } Json::Value st_JsonXAuthorize = st_JsonRoot["XAuthorize"]; pSt_ServerConfig->st_XAuthorize.bHTTPAuth = st_JsonXAuthorize["bHTTPAuth"].asBool(); - _tcsxcpy(pSt_ServerConfig->st_XAuthorize.tszHTTPPass, st_JsonXAuthorize["tszHTTPPass"].asCString()); - _tcsxcpy(pSt_ServerConfig->st_XAuthorize.tszToken, st_JsonXAuthorize["tszToken"].asCString()); if (st_JsonRoot["XReport"].empty() || (3 != st_JsonRoot["XReport"].size())) { diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 398c7ee..7c95ff5 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -23,8 +23,8 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP LPCXSTR lpszAPIGetList = _X("getlist"); LPCXSTR lpszAPIGetOnline = _X("getonline"); LPCXSTR lpszAPICreateTopic = _X("createtopic"); - LPCXSTR lpszAPIDelTopic = _X("deltopic"); - LPCXSTR lpszAPIDelUser = _X("deluser"); + LPCXSTR lpszAPIDelTopic = _X("deletetopic"); + LPCXSTR lpszAPIDelUser = _X("deleteuser"); //判断是否需要验证,不是注册协议 if (st_ServiceCfg.st_XAuthorize.bHTTPAuth && (0 != _tcsxnicmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister)))) @@ -162,12 +162,12 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP 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_PROTOCOLHDR), XENGINE_MQAPP_NETTYPE_HTTP); + 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))) { - //http://127.0.0.1:5202/api?function=deltopic + //http://127.0.0.1:5202/api?function=deletetopic XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; XENGINE_PROTOCOLHDR st_ProtocolHdr = {}; @@ -177,7 +177,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP 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_PROTOCOLHDR), XENGINE_MQAPP_NETTYPE_HTTP); + 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))) From 9340f48380c57e92a3c9eb8a564028b9dc966d2b Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 24 May 2025 10:04:19 +0800 Subject: [PATCH 25/28] modify:remove http log for create and delete topic --- .../MQService_HTTPTask/MQService_HTTPPost.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 7c95ff5..8b6cf3c 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -126,7 +126,6 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP 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,类型:%d"), lpszClientAddr, nListCount, nType); } else if (0 == _tcsxnicmp(lpszAPIGetTopic, lpszFuncName, _tcsxlen(lpszAPIGetTopic))) { @@ -137,7 +136,6 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP DBModule_MQData_GetLeftCount(tszTopicName, 0, &nDBCount); ProtocolModule_Packet_TopicName(tszSDBuffer, &nSDLen, tszTopicName, nDBCount); 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, tszTopicName, nDBCount); } else if (0 == _tcsxnicmp(lpszAPIGetList, lpszFuncName, _tcsxlen(lpszAPIGetList))) { From 5c5a42b6f3bb418b8a7a73b360cee7d33464da9d Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 24 May 2025 10:06:15 +0800 Subject: [PATCH 26/28] update:document and configure file --- CHANGELOG | 34 ++++++++++++++++++ XEngine_Docment/Docment_en.docx | Bin 134191 -> 132991 bytes XEngine_Docment/Docment_zh.docx | Bin 136711 -> 136743 bytes .../XEngine_Config/XEngine_VerConfig.json | 1 + 4 files changed, 35 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index fd32663..06cad56 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,37 @@ +XEngine_MQService V3.16.0.1001 + +增加:CI发布更多系统支持 +增加:HTTP创建主题支持 +更新:编译脚本 +更新:依赖库 +修改:调整用户默认注册级别 +修改:只有在发布版本下才发送信息报告了 +修改:注册和删除协议使用HTTP替代 +修改:http获取方法移动合并到新的目录 +修改:调整http验证方法,现在使用token替代了 +修改:http请求api 使用post并且只有post才做验证 +修改:区分了http的get和post处理 +修改:http删除和创建主题名称并且都交给tcp代码处理 +修改:tcp处理支持http协议了 +修复:删除协议解析不生效 +删除:多余代码 + +added:ci more release support +added:create topic support for http +update:make file build flags +update:depend library +modify:adjust user register level +modify:only release work for report info and improved get time function +modify:register and delete protocol use http instead +modify:http get method move to http task dir +modify:adjust http authorize method.now it use token instead with get +modify:http request info api to post and post verification +modify:The http protocol distinguishes the API get information +modify:delete and create topic convert to tcp handle +modify:tcp task handle http type support +fixed:delete not parse protocol +delete:redundant functions +====================================================================================== XEngine_MQService V3.15.0.1001 增加:HTTP验证授权支持 diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index 042cbc8950cf3e4b277be5276fbe5e04a4b337ea..7c700baa18754d7f1bccd6c8a795b2c36e0f1537 100644 GIT binary patch delta 106782 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 a;DumtKyYn5Fbn+dZ7>Bv1P)dd^#1^AKLW4- delta 107960 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�+1iE3KbjCtFa1kf6P&#&KE$#TF_9WQ#8!l_E~wbL&3oUtck?Z+Zu#11`;(N&TyOtw-#%-DyY-*GeV)O_1JaX}i#;8Hurwo4Fgkg=;3I9QZ{Mpf zb4^#hxvad)mX_BukNsRdJhZKXJ34BFbB`_p{b$Xe&OPS#-{9z(xV(BX#QMG*GJZop z-g&hdb0SM!Za;1Ao|^96%(Ce(ljtZ!eEhH1qBd9l1pVW5j_~~eVc)%a1C1}yCA!nw zIo}V3H-X~@t>=6mfeAlD!Ytcv!~x8tvvjCZx0qtXm?LgI?M5Qx9G8_Nt@|scG+<^m7vk zcMU0HJvJOa-NGl#-Oywm-$IOV;Bd~j?AvzuwgF;m>4#tUEp-d2xW(Lj)GO4ScY5)7~LqHs64oBlShTk$XDYMx6UC}Q8yFRyWbD6i%?bH zleF_<7~4aCFQwHXg)SHIu@^EpCykP9UKzADJK#zf(NpU@T$gUQ9jNULYH(BGDVQ^z z>!w-6HKA8TKqh`zI%bAuHlCA8V_uU0N6fK&3ltOHrenI}FojnU!mo7zxam#V>;0^o zvaYk0t}Oc2bKUA%MM-MiG`*IU_Q6^+KHK2hphUg-tE}NK4W-M_4Bc(|BOZ54`#O+E*}J>)#qMTOPs&{RF=d@72_SN9TpAo;UOd&IV;v?E z1dZh+|Mb_-uUA{fP~@Ndx;)g~qDXV={v7{iG;%AWV=uZYfxbZG+t?PC)s-X)k_^M3 zyeD}NnW2jT0$pQ53jScw0Xe_*JbpYN0j$f{ zBjFLI7SvXDd|OVzR*8}#-%^d{MNK#-((FXW)N!JVK9oKgn%!Bn(|)@1kyNYTZA#Af z7~w&n$a>U1ZI;m-%?e~oI_W0T7mISHTHxB{+~AEg-<@l}_f z^1+|01EptDR>^PclOCBEru1;bif}e=LR{prNfTV{4r)!|?`8@pYn1Q*j5>4jI~7XZ z?jNP{|B$g%*fXr#V-p=4#8o^Flli?*ZBmMHCTZQbmgZ268xcKP&!(K!_*MLQd=83I z5Zo*9KC{dG;GL!x^9v1~fQe$SS=x!r5h>S9*Spws4RUI>Q}6E-u%5Zdrcz#y)fWS_ zE|%@HIJ}Eh52DOIM#ZIHc!oq@^_CE?O?4%?(}rvGJ@8F<1^gYAYb}Lg%z?4v<_a}+ zS|ctnI57Z?9)61G6KrU~W~cUVo!pWmIeTMtR>)X?7V*Vc?JN#23n=X8bKK28m8e&p@%Fh0m)PI?~TPW5EZRWYw=IHp?;N9QrN{`~8OLG5Ja- ztj)1S{yenTuk~qqty4y0)`>IZwu!$Lht3SLeLDeEe|ETys{su}F4^KI;&0O&M-?z7 zIMq>v80>rK6NA4COg)enk8@T!P4=@c?wI2@&{2EQrqiQ*{)}NSw?^f&`(n8^&eTpB z;^pbBL_D2QC6p4^z%IOO3FMRTSR{Ak&rloGVyxN>A$eZ+r{E`IwCXZsuU-8SKX|p-BzeF%u0=@A+%dEwpmcO7Vf7?d zN|8JFcZkb{YbMpVjuf7l8P%M)*vGLzzWPWHNrhlk{?LTdf<5Monv z!E9u(8=FaDUGj6SsrTa795|W zTNeX>K_C>oC|}>*-Sjg&1i{Uv;;c5{U3)__`jpv z_OI+9-C!^+Lu~gfQCX38n+@ zK_H(o!JG_!6*XR-QWzi$d7S^%T3jyV3==F3=30O}#RAKMr4}JRSYRb^E@&+5s!tl>z3<6R7!$y~eFCZP*U^%cR z9D@4G*54BfdNlpfJ^b&HV7rFM;(*y0{_mrKmiX`fm)}CdaKKVvOBAFX2kk8v7!0|? b0jp#2V}U`CJQM~K#2FV%f+K>1Rt5bZ--W$n diff --git a/XEngine_Docment/Docment_zh.docx b/XEngine_Docment/Docment_zh.docx index 3600586a20d21fff1b376bb39f06c99e5fc22c4d..ada521d84035ccaa8fbb3a314a7a0296f93195f1 100644 GIT binary patch delta 117214 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 DGfSgc delta 117176 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 KjZXlmi2(pzZ9rxK diff --git a/XEngine_Release/XEngine_Config/XEngine_VerConfig.json b/XEngine_Release/XEngine_Config/XEngine_VerConfig.json index 19dc911..5fc8e48 100644 --- a/XEngine_Release/XEngine_Config/XEngine_VerConfig.json +++ b/XEngine_Release/XEngine_Config/XEngine_VerConfig.json @@ -1,5 +1,6 @@ { "XVer":[ + "3.16.0.1001 Build20250524", "3.15.0.1001 Build20250313", "3.14.0.1001 Build20250120", "3.13.0.1001 Build20241129", From cac7188648b86b50b480569e5cef13acccad1745 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 24 May 2025 11:15:31 +0800 Subject: [PATCH 27/28] added:http and websocket send message use memory pool --- .../XEngine_MQServiceApp/MQService_Hdr.h | 2 + .../XEngine_MQServiceApp/MQService_Net.cpp | 21 +++----- .../XEngine_MQServiceApp.cpp | 51 +++++++++++-------- .../XEngine_MQServiceApp.vcxproj | 1 + .../XEngine_MQServiceApp.vcxproj.filters | 3 ++ 5 files changed, 45 insertions(+), 33 deletions(-) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h index cb5ba9d..f9f2269 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h @@ -79,10 +79,12 @@ extern XHANDLE xhTCPPool; extern XHANDLE xhHttpPool; extern XHANDLE xhWSPool; extern XHANDLE xhMQTTPool; +extern XHANDLE xhMemPool; extern XENGINE_SERVERCONFIG st_ServiceCfg; extern MESSAGEQUEUE_DBCONFIG st_DBConfig; +#include "MQService_MemoryPool.h" #include "MQService_Config.h" #include "MQService_Net.h" #include "MQService_TCPTask.h" diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp index a788ed4..ce31543 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp @@ -177,19 +177,16 @@ bool XEngine_MQXService_Send(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int } else if (XENGINE_MQAPP_NETTYPE_HTTP == nIPProto) { - int nPKTLen = 8196; - XCHAR tszPKTBuffer[8196]; - RFCCOMPONENTS_HTTP_HDRPARAM st_HTTPHdr; - - memset(tszPKTBuffer, '\0', sizeof(tszPKTBuffer)); - memset(&st_HTTPHdr, '\0', sizeof(RFCCOMPONENTS_HTTP_HDRPARAM)); + CMQService_MemoryPool m_MQMemoryPool(XENGINE_MEMORY_SIZE_MAX); + int nSDLen = XENGINE_MEMORY_SIZE_MAX; + RFCCOMPONENTS_HTTP_HDRPARAM st_HTTPHdr = {}; st_HTTPHdr.nHttpCode = 200; st_HTTPHdr.bIsClose = true; _tcsxcpy(st_HTTPHdr.tszMimeType, _X("json")); - HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszPKTBuffer, &nPKTLen, &st_HTTPHdr, lpszMsgBuffer, nMsgLen); - if (!NetCore_TCPXCore_SendEx(xhHTTPSocket, lpszClientAddr, tszPKTBuffer, nPKTLen)) + HttpProtocol_Server_SendMsgEx(xhHTTPPacket, m_MQMemoryPool.get(), &nSDLen, &st_HTTPHdr, lpszMsgBuffer, nMsgLen); + if (!NetCore_TCPXCore_SendEx(xhHTTPSocket, lpszClientAddr, m_MQMemoryPool.get(), nSDLen)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("发送数据给HTTP客户端:%s,失败,错误:%lX"), lpszClientAddr, NetCore_GetLastError()); return false; @@ -197,11 +194,9 @@ bool XEngine_MQXService_Send(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int } else if (XENGINE_MQAPP_NETTYPE_WEBSOCKET == nIPProto) { - XCHAR tszPKTBuffer[8196]; - memset(tszPKTBuffer, '\0', sizeof(tszPKTBuffer)); - - RfcComponents_WSCodec_EncodeMsg(lpszMsgBuffer, tszPKTBuffer, &nMsgLen, ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE_TEXT); - if (!NetCore_TCPXCore_SendEx(xhWSSocket, lpszClientAddr, tszPKTBuffer, nMsgLen)) + CMQService_MemoryPool m_MQMemoryPool(XENGINE_MEMORY_SIZE_MAX); + RfcComponents_WSCodec_EncodeMsg(lpszMsgBuffer, m_MQMemoryPool.get(), &nMsgLen, ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE_TEXT); + if (!NetCore_TCPXCore_SendEx(xhWSSocket, lpszClientAddr, m_MQMemoryPool.get(), nMsgLen)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("发送数据给Websocket客户端:%s,失败,错误:%lX"), lpszClientAddr, NetCore_GetLastError()); return false; diff --git a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp index fdfed94..25a8e72 100644 --- a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp @@ -16,6 +16,7 @@ XHANDLE xhTCPPool = NULL; XHANDLE xhHttpPool = NULL; XHANDLE xhWSPool = NULL; XHANDLE xhMQTTPool = NULL; +XHANDLE xhMemPool = NULL; XENGINE_SERVERCONFIG st_ServiceCfg; MESSAGEQUEUE_DBCONFIG st_DBConfig; @@ -41,6 +42,7 @@ void ServiceApp_Stop(int signo) ManagePool_Thread_NQDestroy(xhHttpPool); ManagePool_Thread_NQDestroy(xhWSPool); ManagePool_Thread_NQDestroy(xhMQTTPool); + ManagePool_Memory_Destory(xhMemPool); DBModule_MQData_Destory(); DBModule_MQUser_Destory(); @@ -151,7 +153,7 @@ int main(int argc, char** argv) if (NULL == xhLog) { printf("启动服务器失败,启动日志失败,错误:%lX", XLog_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } HelpComponents_XLog_SetLogPriority(xhLog, st_ServiceCfg.st_XLog.nLogLeave); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化日志系统成功")); @@ -159,7 +161,7 @@ int main(int argc, char** argv) if (!Config_Json_DBFile(lpszDBConfig, &st_DBConfig)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化数据库配置失败,错误:%lX"), Config_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化数据库配置成功")); @@ -174,12 +176,20 @@ int main(int argc, char** argv) signal(SIGABRT, ServiceApp_Stop); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化服务器信号管理成功")); + xhMemPool = ManagePool_Memory_Create(); + if (NULL == xhMemPool) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化内存池失败,错误:%lX"), ManagePool_GetLastError()); + goto XENGINE_APPEXIST; + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化内存池成功")); + if (st_ServiceCfg.st_XMemory.bDataQueryEnable || st_ServiceCfg.st_XMemory.bDataInsertEnable) { if (!MemoryCache_DBData_Init(st_ServiceCfg.st_XMemory.nTimeLast, st_ServiceCfg.st_XMemory.nTimeCount, MessageQueue_CBTask_MemoryCache)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化消息内容高速缓存服务失败,错误:%lX"), MemoryCache_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化消息内容高速缓存服务成功,更新最大时间:%d,存储最大时间:%d"), st_ServiceCfg.st_XMemory.nTimeLast, st_ServiceCfg.st_XMemory.nTimeCount); } @@ -192,7 +202,7 @@ int main(int argc, char** argv) if (!MemoryCache_DBUser_Init(st_ServiceCfg.st_XMemory.nTimeLast, st_ServiceCfg.st_XMemory.nTimeCount, MessageQueue_CBTask_MemoryCache)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化用户信息高速缓存服务失败,错误:%lX"), MemoryCache_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化用户信息高速缓存服务成功,更新最大时间:%d,存储最大时间:%d"), st_ServiceCfg.st_XMemory.nTimeLast, st_ServiceCfg.st_XMemory.nTimeCount); } @@ -206,12 +216,12 @@ int main(int argc, char** argv) if (!DBModule_MQData_Init((DATABASE_MYSQL_CONNECTINFO*)&st_ServiceCfg.st_XSql, st_ServiceCfg.st_XMemory.bDataQueryEnable, st_ServiceCfg.st_XMemory.bDataInsertEnable)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化消息数据数据库失败,错误:%lX"), DBModule_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } if (!DBModule_MQUser_Init((DATABASE_MYSQL_CONNECTINFO*)&st_ServiceCfg.st_XSql, st_ServiceCfg.st_XMemory.bUserQueryEnable, MessageQueue_CBTask_TimePublish)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化消息用户数据库失败,错误:%lX"), DBModule_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化数据库服务成功")); } @@ -219,7 +229,7 @@ int main(int argc, char** argv) if (!SessionModule_Client_Init()) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("初始化客户端会话管理器失败,错误:%lX"), SessionModule_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化客户端会话管理器成功")); //TCP消息服务 @@ -230,7 +240,7 @@ int main(int argc, char** argv) if (NULL == xhTCPPacket) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("初始化TCP组包器失败,错误:%lX"), Packets_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动TCP组包器成功")); //启动网络 @@ -238,7 +248,7 @@ int main(int argc, char** argv) if (NULL == xhTCPSocket) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动TCP网络服务器失败,错误:%lX"), NetCore_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动TCP网络服务器成功,TCP端口:%d,IO:%d"), st_ServiceCfg.nTCPPort, st_ServiceCfg.st_XMax.nIOThread); NetCore_TCPXCore_RegisterCallBackEx(xhTCPSocket, MessageQueue_Callback_TCPLogin, MessageQueue_Callback_TCPRecv, MessageQueue_Callback_TCPLeave); @@ -257,7 +267,7 @@ int main(int argc, char** argv) if (NULL == xhTCPPool) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动TCP线程池服务失败,错误:%lX"), ManagePool_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动TCP线程池服务成功,启动个数:%d"), st_ServiceCfg.st_XMax.nTCPThread); } @@ -272,7 +282,7 @@ int main(int argc, char** argv) if (NULL == xhHTTPPacket) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务器中,初始化HTTP组包失败,错误:%lX"), HttpProtocol_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化HTTP组包成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nHttpThread); @@ -280,7 +290,7 @@ int main(int argc, char** argv) if (NULL == xhHTTPSocket) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动HTTP网络服务器失败,错误:%lX"), NetCore_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动HTTP网络服务器成功,HTTP端口:%d,IO:%d"), st_ServiceCfg.nHttpPort, st_ServiceCfg.st_XMax.nIOThread); NetCore_TCPXCore_RegisterCallBackEx(xhHTTPSocket, MessageQueue_Callback_HttpLogin, MessageQueue_Callback_HttpRecv, MessageQueue_Callback_HttpLeave); @@ -299,7 +309,7 @@ int main(int argc, char** argv) if (NULL == xhHttpPool) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动HTTP线程池服务失败,错误:%lX"), ManagePool_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动HTTP线程池服务成功,启动个数:%d"), st_ServiceCfg.st_XMax.nHttpThread); } @@ -314,7 +324,7 @@ int main(int argc, char** argv) if (NULL == xhWSPacket) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务器中,初始化Websocket组包失败,错误:%lX"), WSFrame_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化Websocket组包成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nWSThread); @@ -322,7 +332,7 @@ int main(int argc, char** argv) if (NULL == xhWSSocket) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动Websocket网络服务器失败,错误:%lX"), NetCore_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动Websocket网络服务器成功,Websocket端口:%d,IO:%d"), st_ServiceCfg.nWSPort, st_ServiceCfg.st_XMax.nIOThread); NetCore_TCPXCore_RegisterCallBackEx(xhWSSocket, MessageQueue_Callback_WSLogin, MessageQueue_Callback_WSRecv, MessageQueue_Callback_WSLeave); @@ -341,7 +351,7 @@ int main(int argc, char** argv) if (NULL == xhWSPool) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动Websocket线程池服务失败,错误:%lX"), ManagePool_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动Websocket线程池服务成功,启动个数:%d"), st_ServiceCfg.st_XMax.nWSThread); } @@ -355,7 +365,7 @@ int main(int argc, char** argv) if (!MQTTProtocol_Parse_Init(st_ServiceCfg.st_XMax.nMQTTThread)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务器中,初始化MQTT组包失败,错误:%lX"), MQTTProtocol_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化MQTT组包成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nMQTTThread); @@ -363,7 +373,7 @@ int main(int argc, char** argv) if (NULL == xhMQTTSocket) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动MQTT网络服务器失败,错误:%lX"), NetCore_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动MQTT网络服务器成功,MQTT端口:%d,IO:%d"), st_ServiceCfg.nMQTTPort, st_ServiceCfg.st_XMax.nMQTTThread); NetCore_TCPXCore_RegisterCallBackEx(xhMQTTSocket, MessageQueue_Callback_MQTTLogin, MessageQueue_Callback_MQTTRecv, MessageQueue_Callback_MQTTLeave); @@ -382,7 +392,7 @@ int main(int argc, char** argv) if (NULL == xhWSPool) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动MQTT线程池服务失败,错误:%lX"), ManagePool_GetLastError()); - goto NETSERVICEEXIT; + goto XENGINE_APPEXIST; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动MQTT线程池服务成功,启动个数:%d"), st_ServiceCfg.st_XMax.nMQTTThread); } @@ -420,7 +430,7 @@ int main(int argc, char** argv) } std::this_thread::sleep_for(std::chrono::seconds(1)); } -NETSERVICEEXIT: +XENGINE_APPEXIST: bIsRun = false; if (bIsTest && 0 == nRet) @@ -446,6 +456,7 @@ int main(int argc, char** argv) ManagePool_Thread_NQDestroy(xhHttpPool); ManagePool_Thread_NQDestroy(xhWSPool); ManagePool_Thread_NQDestroy(xhMQTTPool); + ManagePool_Memory_Destory(xhMemPool); DBModule_MQData_Destory(); DBModule_MQUser_Destory(); diff --git a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj index a3a9b07..63e0c4d 100644 --- a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj +++ b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj @@ -251,6 +251,7 @@ + diff --git a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj.filters b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj.filters index 6da71da..d7a9f61 100644 --- a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj.filters +++ b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.vcxproj.filters @@ -83,5 +83,8 @@ 头文件\MQService_HTTPTask + + 头文件 + \ No newline at end of file From 2726e5a08de5661fe0ecd387e71c7658a235eda5 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 24 May 2025 11:16:17 +0800 Subject: [PATCH 28/28] added:memory pool file --- CHANGELOG | 2 + .../MQService_MemoryPool.h | 44 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 XEngine_Source/XEngine_MQServiceApp/MQService_MemoryPool.h diff --git a/CHANGELOG b/CHANGELOG index 06cad56..a3b41ee 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ XEngine_MQService V3.16.0.1001 +增加:使用内存池发送数据 增加:CI发布更多系统支持 增加:HTTP创建主题支持 更新:编译脚本 @@ -16,6 +17,7 @@ XEngine_MQService V3.16.0.1001 修复:删除协议解析不生效 删除:多余代码 +added:memory pool send message added:ci more release support added:create topic support for http update:make file build flags diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_MemoryPool.h b/XEngine_Source/XEngine_MQServiceApp/MQService_MemoryPool.h new file mode 100644 index 0000000..0a1bc41 --- /dev/null +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_MemoryPool.h @@ -0,0 +1,44 @@ +#pragma once +/******************************************************************** +// Created: 2025/05/24 10:55:24 +// File Name: D:\XEngine_MQService\XEngine_Source\XEngine_MQServiceApp\MQService_MemoryPool.h +// File Path: D:\XEngine_MQService\XEngine_Source\XEngine_MQServiceApp +// File Base: MQService_MemoryPool +// File Ext: h +// Project: XEngine +// Author: qyt +// Purpose: 内存池封装 +// History: +*********************************************************************/ +class CMQService_MemoryPool +{ +public: + CMQService_MemoryPool(size_t nSize) + { + lPtr = ManagePool_Memory_Alloc(xhMemPool, nSize); + if (NULL == lPtr) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ALERT, _X("内存池分配失败,系统面临崩溃!")); + return; + } + } + ~CMQService_MemoryPool() + { + if (NULL != lPtr) + { + ManagePool_Memory_Free(xhMemPool, lPtr); + } + } +public: + // 支持类型转换 + template + T* as() { + return static_cast(lPtr); + } + XCHAR* get() + { + return static_cast(lPtr); + } +private: + XPVOID lPtr = NULL; +}; \ No newline at end of file