bonus-edge-proxy/archive

77 lines
3.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef TCP_SERVER_H
#define TCP_SERVER_H
#include <boost/asio.hpp>
#include <boost/crc.hpp>
#include <vector>
#include <string>
#include <memory> // For std::enable_shared_from_this
#include <cstdint> // 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<uint8_t> 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<session> {
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<uint8_t>& 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<uint8_t>& 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