#include "util.h" #include #include std::shared_ptr get_logger(const std::string& mark, const std::string& log_file) { auto file_sink = std::make_shared(log_file, g_BuffSize * 50, 3); auto console_sink = std::make_shared(); file_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e][%l]: %v"); console_sink->set_color(spdlog::level::level_enum::info, 0xFFFF); console_sink->set_pattern("%^[%Y-%m-%d %H:%M:%S.%e][%l]: %v%$"); std::vector sinks{file_sink, console_sink}; auto logger = std::make_shared(mark, sinks.begin(), sinks.end()); logger->set_level(spdlog::level::debug); spdlog::register_logger(logger); return logger; } CTransProtocal::CTransProtocal() { } CTransProtocal::~CTransProtocal() { } /* 【 transm TCP 数据协议 】 header 2 char: 0xFF 0xFE type 2 char: mark 1 char: from 32 char: to 32 char: len 4 char: data xxxxx: tail 2 char: 0xFF 0xFF */ CFrameBuffer* CTransProtocal::parse(CMutBuffer& buffer) { CFrameBuffer* result = nullptr; unsigned char header[] = {0xFF, 0xFE}; unsigned char tail[] = {0xFF, 0xFF}; int find = buffer.index_of((const char*)header, sizeof(header)); if (find < 0) { return result; } int16_t type = *(reinterpret_cast(buffer.get_data() + find + 2)); char mark = *(buffer.get_data() + find + 2 + 2); int32_t len = *(reinterpret_cast(buffer.get_data() + find + 2 + 2 + 1 + 32 + 32)); int32_t tail_index = find + 2 + 2 + 1 + 32 + 32 + 4 + len; if (buffer.get_len() - 2 < tail_index || len < 0) { return result; } unsigned char taila = *((unsigned char*)(buffer.get_data() + tail_index)); unsigned char tailb = *((unsigned char*)(buffer.get_data() + tail_index + 1)); if (taila != tail[0] || tailb != tail[1]) { return result; } result = new CFrameBuffer(); result->data_ = new char[len]; std::memset(result->data_, 0x0, len); result->len_ = len; result->fid_ = std::string(buffer.get_data() + find + 2 + 2 + 1); result->tid_ = std::string(buffer.get_data() + find + 2 + 2 + 1 + 32); result->mark_ = mark; result->type_ = static_cast(type); std::memcpy(result->data_, buffer.get_data() + find + 2 + 2 + 1 + 4 + 32 + 32, len); buffer.remove_of(0, tail_index + 2); return result; } bool CTransProtocal::pack(CFrameBuffer* buf, char** out_buf, int& len) { if (buf == nullptr) { return false; } if (buf->data_ == nullptr) { buf->len_ = 0; } unsigned char header[] = {0xFF, 0xFE}; unsigned char tail[] = {0xFF, 0xFF}; len = buf->len_ + 75; *out_buf = new char[len]{}; std::memset(*out_buf, 0x0, len); std::memcpy(*out_buf, header, 2); std::memcpy(*out_buf + 2, &buf->type_, 2); std::memcpy(*out_buf + 2 + 2, &buf->mark_, 1); if (!buf->fid_.empty()) { std::memcpy(*out_buf + 2 + 2 + 1, buf->fid_.data(), buf->fid_.size()); } if (!buf->tid_.empty()) { std::memcpy(*out_buf + 2 + 2 + 1 + 32, buf->tid_.data(), buf->tid_.size()); } std::memcpy(*out_buf + 2 + 2 + 1 + 32 + 32, &buf->len_, 4); if (buf->data_ != nullptr) { std::memcpy(*out_buf + 2 + 2 + 1 + 32 + 32 + 4, buf->data_, buf->len_); } std::memcpy(*out_buf + len - 2, tail, 2); return true; } CFrameBuffer::CFrameBuffer() { } CFrameBuffer::~CFrameBuffer() { delete[] data_; len_ = 0; }