#ifndef TCP_SERVER_H #define TCP_SERVER_H #include #include #include #include #include // For std::enable_shared_from_this #include // For uint8_t, uint16_t, uint32_t // 使用 Boost.Asio 的命名空间 using boost::asio::ip::tcp; // ---------------- CRC32 Declaration (使用 Boost.CRC) ---------------- inline uint32_t calculate_crc32(const uint8_t* data, size_t length); // ---------------- Protocol Definition ---------------- namespace proto { struct ProtocolConfig { static constexpr std::size_t kMagicLen = 4; // 魔数 4 字节 static constexpr std::size_t kMsgTypeLen = 2; // 消息类型 2 字节 static constexpr std::size_t kPayloadLenFieldLen = 4; // 载荷长度 4 字节 static constexpr std::size_t kCrcLen = 4; // CRC 校验位 4 字节 // 完整的头部长度 (Magic + MsgType + PayloadLenField) static constexpr std::size_t kHeaderLen = kMagicLen + kMsgTypeLen + kPayloadLenFieldLen; // 4 + 2 + 4 = 10 字节 // 魔数常量 static constexpr uint8_t kMagic[kMagicLen] = {0x62, 0x6e, 0x73, 0x00}; }; // 字节序转换函数声明 inline uint16_t be16(const uint8_t* p); inline uint32_t be32(const uint8_t* p); inline void write_be16(uint8_t* p, uint16_t val); inline void write_be32(uint8_t* p, uint32_t val); struct Message { uint16_t msg_type = 0; // 消息类型 2 字节 std::vector payload; uint32_t received_crc = 0; // 新增字段,用于存储接收到的CRC,方便调试 }; inline bool match_magic(const uint8_t* p); } // ---------------- Session Class (处理单个客户端连接) ---------------- class session : public std::enable_shared_from_this { public: explicit session(tcp::socket socket); void start(); private: // 自定义缓冲区结构体 struct ReceiveBuffer { static constexpr std::size_t capacity_ = 8192; uint8_t data_[capacity_]; std::size_t read_idx = 0; // 已读到缓冲区的数据量 (读指针) std::size_t write_idx = 0; // 已处理/消耗的字节数 (写指针,指向下一个待处理字节) void compact(); std::size_t data_size() const; std::size_t free_space() const; const uint8_t* current_data() const; uint8_t* write_ptr(); } receive_buffer_; void do_read_some(); void parse_messages(); std::string payload_to_ascii_string(const std::vector& payload); std::string bytes_to_hex_string(const uint8_t* data, std::size_t len); void on_message(proto::Message msg); // 修改原有的 send_response 为更通用的 send_message void send_message(uint16_t msg_type, const std::vector& payload); tcp::socket socket_; }; // ---------------- TCPServer Class ---------------- // 这个类负责监听端口并接受新的客户端连接 class TCPServer { public: TCPServer(boost::asio::io_context& io_context, uint16_t port); private: void do_accept(); tcp::acceptor acceptor_; }; #endif // SERVER_H