mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-08-09 02:07:04 +08:00
refactor(network): extract packet header decoding into function
This commit is contained in:
@@ -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");
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user