MOOON主要訊息結構如下,缺點是訊息本身佔用位元組數較多:
// 為何要做IPV4和IPV6區分?// 是因為如果只需要支援IPV4,則一個IP地址只需要用一個4位元組表示,// 這樣源和目的IP地址共節省了24位元組;// 支援IPV6時,同時相容IPV4,但對於IPV4多浪費24位元組;// 源和目標IP,要麼都為IPV4,要麼都為IPV6,不允許交叉出現。#ifdef IPV6_SUPPORTED #define IP_BYTES (4*4) // IPV6的地址長度#else #define IP_BYTES 4 // IPV4的地址長度#endif////////////////////////////////////////////////////////////////////////////////SCHED_NAMESPACE_BEGIN/*** * 常量定義 */enum{INVALID_SERVICE_ID = 0,INVALID_SESSION_ID = 0, // 無效的SessionIdSERVICE_ID_MAX = 100, // 最大的Service ID值,取值從1開始SESSION_ID_MAX = 10000 // 最大的Session ID值,取值從1開始};// 按4位元組對齊#pragma pack(4)/*** * 分布式訊息Flags結構 * 為什麼Flags要單獨定義成一個struct, * 是因為nuint32_t類型不支援位表達方式, * 所以使用struct做一層轉換,以達到相同的目的 */typedef struct TDistributedMessageFlags{ // 使用union,方便操作 union Flags { uint32_t flags; struct TFlagsBits { uint32_t ip_type:1; // IP地址類型,取值為net::IP_TYPE_4或net::IP_TYPE_6 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; // 訊息頭 nuint32_t flags; // 標誌欄位 nuint32_t source_ip[IP_BYTES]; // 訊息源的IP地址,如果是IPV4地址,則N值為1,否則為4 nuint32_t destination_ip[IP_BYTES]; // 訊息目的地的IP地址,如果是IPV4地址,則N值為1,否則為4 nuint16_t source_port; // 訊息源的連接埠號碼 nuint16_t destination_port; // 訊息目的地的連接埠號碼 nuint32_t source_service_id; // destination_Service ID nuint32_t destination_service_id; // 訊息目的地的Service ID nuint32_t source_session_id; // destination_Session ID nuint32_t destination_session_id; // 訊息目的地的Session ID nuint32_t source_sequence_number; // 序號,從0開始,依次遞增,直到重來,用於解決類似於TCP中的timed_wait問題 nuint32_t destination_sequence_number; // 序號,從0開始,依次遞增,直到重來,用於解決類似於TCP中的timed_wait問題 nuint32_t source_thread_affinity; // 線程親和值,為的是和線程建立綁定關係 nuint32_t destination_thread_affinity; // 線程親和值,為的是和線程建立綁定關係 char data[0]; // 訊息內容 std::string to_string() const;}distribted_message_t;#pragma pack()inline bool is_valid_service(uint32_t service_id){return service_id > 0&& service_id <= SERVICE_ID_MAX;}inline bool is_valid_session(uint32_t session_id){return session_id > 0&& session_id <= SESSION_ID_MAX;}////////////////////////////////////////////////////////////////////////////////SCHED_NAMESPACE_END
: