程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> MOOON分布式消息結構

MOOON分布式消息結構

編輯:關於C語言

 MOOON主要消息結構如下,缺點是消息本身占用字節數較多:

  1. // 為何要做IPV4和IPV6區分? 
  2. // 是因為如果只需要支持IPV4,則一個IP地址只需要用一個4字節表示, 
  3. // 這樣源和目的IP地址共節省了24字節; 
  4. // 支持IPV6時,同時兼容IPV4,但對於IPV4多浪費24字節; 
  5. // 源和目標IP,要麼都為IPV4,要麼都為IPV6,不允許交叉出現。 
  6. #ifdef IPV6_SUPPORTED 
  7.     #define IP_BYTES (4*4) // IPV6的地址長度 
  8. #else 
  9.     #define IP_BYTES 4     // IPV4的地址長度 
  10. #endif 
  11.  
  12. //////////////////////////////////////////////////////////////////////////////// 
  13. SCHED_NAMESPACE_BEGIN 
  14.  
  15. /*** 
  16.   * 常量定義 
  17.   */ 
  18. enum 
  19.     INVALID_SERVICE_ID = 0, 
  20.     INVALID_SESSION_ID = 0,  // 無效的SessionId 
  21.     SERVICE_ID_MAX = 100,    // 最大的Service ID值,取值從1開始 
  22.     SESSION_ID_MAX = 10000   // 最大的Session ID值,取值從1開始 
  23. }; 
  24.  
  25. // 按4字節對齊 
  26. #pragma pack(4) 
  27.  
  28. /*** 
  29.   * 分布式消息Flags結構 
  30.   * 為什麼Flags要單獨定義成一個struct, 
  31.   * 是因為nuint32_t類型不支持位表達方式, 
  32.   * 所以使用struct做一層轉換,以達到相同的目的 
  33.   */ 
  34. typedef struct TDistributedMessageFlags 
  35.     // 使用union,方便操作 
  36.     union Flags 
  37.     { 
  38.         uint32_t flags; 
  39.         struct TFlagsBits 
  40.         { 
  41.             uint32_t ip_type:1;      // IP地址類型,取值為net::IP_TYPE_4或net::IP_TYPE_6 
  42.             uint32_t reserved:31;    // 保留用的位 
  43.         }flags_bits; 
  44.     }flags; 
  45.  
  46.     TDistributedMessageFlags(uint32_t v) 
  47.      :flags(v) 
  48.     { 
  49.     } 
  50. }distribted_message_flags_t; 
  51.  
  52. /*** 
  53.   * 分布式消息頭結構 
  54.   */ 
  55. typedef struct TDistributedMessage 
  56.     net::common_message_header header;     // 消息頭 
  57.     nuint32_t flags;                       // 標志字段 
  58.  
  59.     nuint32_t source_ip[IP_BYTES];         // 消息源的IP地址,如果是IPV4地址,則N值為1,否則為4 
  60.     nuint32_t destination_ip[IP_BYTES];    // 消息目的地的IP地址,如果是IPV4地址,則N值為1,否則為4 
  61.  
  62.     nuint16_t source_port;                 // 消息源的端口號 
  63.     nuint16_t destination_port;            // 消息目的地的端口號 
  64.  
  65.     nuint32_t source_service_id;           // destination_Service ID 
  66.     nuint32_t destination_service_id;      // 消息目的地的Service ID 
  67.  
  68.     nuint32_t source_session_id;           // destination_Session ID 
  69.     nuint32_t destination_session_id;      // 消息目的地的Session ID 
  70.  
  71.     nuint32_t source_sequence_number;      // 序列號,從0開始,依次遞增,直到重來,用於解決類似於TCP中的timed_wait問題 
  72.     nuint32_t destination_sequence_number; // 序列號,從0開始,依次遞增,直到重來,用於解決類似於TCP中的timed_wait問題 
  73.  
  74.     nuint32_t source_thread_affinity;      // 線程親和值,為的是和線程建立綁定關系 
  75.     nuint32_t destination_thread_affinity; // 線程親和值,為的是和線程建立綁定關系 
  76.  
  77.     char data[0];                          // 消息內容 
  78.  
  79.     std::string to_string() const; 
  80. }distribted_message_t; 
  81.  
  82. #pragma pack() 
  83.  
  84. inline bool is_valid_service(uint32_t service_id) 
  85.     return service_id > 0 
  86.         && service_id <= SERVICE_ID_MAX; 
  87.  
  88. inline bool is_valid_session(uint32_t session_id) 
  89.     return session_id > 0 
  90.         && session_id <= SESSION_ID_MAX; 
  91.  
  92. //////////////////////////////////////////////////////////////////////////////// 
  93. SCHED_NAMESPACE_END 

示意圖:

 

本文出自 “飛月” 博客,請務必保留此出處http://mooon.blog.51cto.com/1246491/948302

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved