為兼容雙協議棧,訊息頭採用編譯期宏切換地址長度:
#ifdef IPV6_SUPPORTED
#define IP_BYTES (4*4) // IPv6 16 bytes
#else
#define IP_BYTES 4 // IPv4 4 bytes
#endif
來源與目標 IP 必須同版本,不允許混用,犧牲 IPv4 場景 24 bytes 空間換取代碼簡潔與零拷貝解析。
#pragma pack(4) // 4-byte 對齊
typedef struct TDistributedMessageFlags {
union {
uint32_t flags;
struct {
uint32_t ip_type:1; // IPv4/IPv6 標識
uint32_t reserved:31; // 預留擴展
} flags_bits;
} flags;
TDistributedMessageFlags(uint32_t v) : flags(v) {}
} distribted_message_flags_t;
typedef struct TDistributedMessage {
net::common_message_header header; // 通用頭部
uint32_t flags; // 標誌位
uint32_t source_ip[IP_BYTES]; // 來源 IP
uint32_t destination_ip[IP_BYTES]; // 目的 IP
uint16_t source_port;
uint16_t destination_port;
uint32_t source_service_id;
uint32_t destination_service_id;
uint32_t source_session_id;
uint32_t destination_session_id;
uint32_t source_sequence_number; // 解決 TIME_WAIT 類問題
uint32_t destination_sequence_number;
uint32_t source_thread_affinity; // 執行緒親和性綁定
uint32_t destination_thread_affinity;
char data[0]; // 柔性陣列承載業務負載
std::string to_string() const; // 除錯轉字串
} distribted_message_t;
#pragma pack()
data[0] 柔性陣列配合記憶體池,實現頭部與負載單次分配IPv4 場景下每訊息固定多佔 24 bytes(雙 IP 各浪費 12 bytes)。高吞吐場景可考慮壓縮編碼或分版本協議優化。