refactor(network): extract packet header decoding into function

This commit is contained in:
2026-06-26 19:20:14 +08:00
parent db7b67f265
commit c7c6ee9a61
2 changed files with 14 additions and 23 deletions

View File

@@ -45,29 +45,24 @@ asio::awaitable<void> NetworkClient::connect(std::string ip, int port) {
asio::awaitable<void> NetworkClient::read_loop() { asio::awaitable<void> NetworkClient::read_loop() {
try { try {
while (true) { while (true) {
std::array<char, HEADER_LEN> header; std::array<char, HEADER_LEN> header_buffer;
co_await asio::async_read(m_socket, asio::buffer(header), co_await asio::async_read(m_socket, asio::buffer(header_buffer),
asio::use_awaitable); asio::use_awaitable);
uint32_t total_len_net; auto header = decode_packet_header(header_buffer);
std::memcpy(&total_len_net, header.data(), sizeof(total_len_net)); uint32_t total_len = HEADER_LEN + header.compressed_size;
uint32_t total_len = ntohl(total_len_net);
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) { if (total_len < HEADER_LEN || total_len > MAX_PACKET_SIZE) {
throw std::runtime_error("invalid packet length"); throw std::runtime_error("invalid packet length");
} }
uint32_t body_len = total_len - HEADER_LEN; std::vector<uint8_t> body_data(header.compressed_size);
std::vector<uint8_t> body_data(body_len); if (header.compressed_size > 0) {
if (body_len > 0) {
co_await asio::async_read(m_socket, asio::buffer(body_data), co_await asio::async_read(m_socket, asio::buffer(body_data),
asio::use_awaitable); asio::use_awaitable);
} }
constexpr auto& to_num = std::to_underlying<PacketEnum>; constexpr auto& to_num = std::to_underlying<PacketEnum>;
switch (cmd_id) { switch (header.cmd) {
case to_num(PacketEnum::LOGIN_RSP): { case to_num(PacketEnum::LOGIN_RSP): {
LoginRsp rsp; LoginRsp rsp;
Logger::info("Client: Receive Login rsp"); Logger::info("Client: Receive Login rsp");

View File

@@ -37,28 +37,24 @@ const std::string& Session::uuid() const { return m_uuid; }
asio::awaitable<void> Session::read_loop() { asio::awaitable<void> Session::read_loop() {
try { try {
while (true) { while (true) {
std::array<char, HEADER_LEN> header; std::array<char, HEADER_LEN> header_buffer;
co_await asio::async_read(m_socket, asio::buffer(header), co_await asio::async_read(m_socket, asio::buffer(header_buffer),
asio::use_awaitable); asio::use_awaitable);
uint32_t total_len_net; auto header = decode_packet_header(header_buffer);
std::memcpy(&total_len_net, header.data(), sizeof(total_len_net)); uint32_t total_len = HEADER_LEN + header.compressed_size;
uint32_t total_len = ntohl(total_len_net);
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) { if (total_len < HEADER_LEN || total_len > MAX_PACKET_SIZE) {
throw std::runtime_error("invalid packet length"); throw std::runtime_error("invalid packet length");
} }
uint32_t body_len = total_len - HEADER_LEN; std::vector<uint8_t> body_data(header.compressed_size);
std::vector<uint8_t> body_data(body_len); if (header.compressed_size > 0) {
if (body_len > 0) {
co_await asio::async_read(m_socket, asio::buffer(body_data), co_await asio::async_read(m_socket, asio::buffer(body_data),
asio::use_awaitable); asio::use_awaitable);
} }
constexpr auto& to_num = std::to_underlying<PacketEnum>; constexpr auto& to_num = std::to_underlying<PacketEnum>;
auto cmd_id = header.cmd;
if (cmd_id == to_num(PacketEnum::LOGIN_REQ)) { if (cmd_id == to_num(PacketEnum::LOGIN_REQ)) {
LoginReq req; LoginReq req;
Logger::info("Session: Receive Login req"); Logger::info("Session: Receive Login req");