From c7c6ee9a611a6ca43b533fb1db0984b185ade8f9 Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Fri, 26 Jun 2026 19:20:14 +0800 Subject: [PATCH] refactor(network): extract packet header decoding into function --- src/gameplay/network_client.cpp | 19 +++++++------------ src/gameplay/session.cpp | 18 +++++++----------- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/src/gameplay/network_client.cpp b/src/gameplay/network_client.cpp index bf4526b..e5692e6 100644 --- a/src/gameplay/network_client.cpp +++ b/src/gameplay/network_client.cpp @@ -45,29 +45,24 @@ asio::awaitable NetworkClient::connect(std::string ip, int port) { asio::awaitable NetworkClient::read_loop() { try { while (true) { - std::array header; - co_await asio::async_read(m_socket, asio::buffer(header), + std::array header_buffer; + co_await asio::async_read(m_socket, asio::buffer(header_buffer), asio::use_awaitable); - uint32_t total_len_net; - std::memcpy(&total_len_net, header.data(), sizeof(total_len_net)); - uint32_t total_len = ntohl(total_len_net); + auto header = decode_packet_header(header_buffer); + uint32_t total_len = HEADER_LEN + header.compressed_size; - uint16_t cmd_id_net; - std::memcpy(&cmd_id_net, header.data() + 4, sizeof(cmd_id_net)); - uint16_t cmd_id = ntohs(cmd_id_net); if (total_len < HEADER_LEN || total_len > MAX_PACKET_SIZE) { throw std::runtime_error("invalid packet length"); } - uint32_t body_len = total_len - HEADER_LEN; - std::vector body_data(body_len); - if (body_len > 0) { + std::vector body_data(header.compressed_size); + if (header.compressed_size > 0) { co_await asio::async_read(m_socket, asio::buffer(body_data), asio::use_awaitable); } constexpr auto& to_num = std::to_underlying; - switch (cmd_id) { + switch (header.cmd) { case to_num(PacketEnum::LOGIN_RSP): { LoginRsp rsp; Logger::info("Client: Receive Login rsp"); diff --git a/src/gameplay/session.cpp b/src/gameplay/session.cpp index d336ded..3c32810 100644 --- a/src/gameplay/session.cpp +++ b/src/gameplay/session.cpp @@ -37,28 +37,24 @@ const std::string& Session::uuid() const { return m_uuid; } asio::awaitable Session::read_loop() { try { while (true) { - std::array header; - co_await asio::async_read(m_socket, asio::buffer(header), + std::array header_buffer; + co_await asio::async_read(m_socket, asio::buffer(header_buffer), asio::use_awaitable); - uint32_t total_len_net; - std::memcpy(&total_len_net, header.data(), sizeof(total_len_net)); - uint32_t total_len = ntohl(total_len_net); + auto header = decode_packet_header(header_buffer); + uint32_t total_len = HEADER_LEN + header.compressed_size; - uint16_t cmd_id_net; - std::memcpy(&cmd_id_net, header.data() + 4, sizeof(cmd_id_net)); - uint16_t cmd_id = ntohs(cmd_id_net); if (total_len < HEADER_LEN || total_len > MAX_PACKET_SIZE) { throw std::runtime_error("invalid packet length"); } - uint32_t body_len = total_len - HEADER_LEN; - std::vector body_data(body_len); - if (body_len > 0) { + std::vector body_data(header.compressed_size); + if (header.compressed_size > 0) { co_await asio::async_read(m_socket, asio::buffer(body_data), asio::use_awaitable); } constexpr auto& to_num = std::to_underlying; + auto cmd_id = header.cmd; if (cmd_id == to_num(PacketEnum::LOGIN_REQ)) { LoginReq req; Logger::info("Session: Receive Login req");