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, // 無效的SessionId
- SERVICE_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
示意圖:
本文出自 “飛月” 博客,請務必保留此出處http://mooon.blog.51cto.com/1246491/948302