network_base.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. //
  2. // Created by huli on 2022/12/30.
  3. //
  4. #ifndef NNXX_TESTS_NETWORK_BASE_H
  5. #define NNXX_TESTS_NETWORK_BASE_H
  6. #include <string>
  7. #include <iostream>
  8. #include <arpa/inet.h>
  9. #include <unistd.h>
  10. #include <fcntl.h>
  11. #include <pthread.h>
  12. #include<netinet/tcp.h>
  13. #include <map>
  14. #include <mutex>
  15. #include <glog/logging.h>
  16. #include "../error_code/error_code.h"
  17. #include "../tool/binary_buf.h"
  18. #include "../tool/thread_safe_list.h"
  19. #include "../tool/thread_condition.h"
  20. #include "../network_communication/network_message.h"
  21. #include "../network_communication/network.pb.h"
  22. //网络通信的基类, linux C语言, 目前只有TCP client,
  23. class Network_base
  24. {
  25. public:
  26. #define NETKORK_PARAMETER_PATH "network.prototxt"
  27. //#define NETKORK_PARAMETER_PATH_A "network_a.prototxt"
  28. //#define NETKORK_PARAMETER_PATH_B "network_b.prototxt"
  29. //#define NETKORK_PARAMETER_PATH_C "network_c.prototxt"
  30. //
  31. //#define RABBITMQ_PARAMETER_PATH_A1 "rabbitmq_a1.prototxt"
  32. //#define RABBITMQ_PARAMETER_PATH_A2 "rabbitmq_a2.prototxt"
  33. //#define RABBITMQ_PARAMETER_PATH_A3 "rabbitmq_a3.prototxt"
  34. //#define RABBITMQ_PARAMETER_PATH_A4 "rabbitmq_a4.prototxt"
  35. //#define RABBITMQ_PARAMETER_PATH_B1 "rabbitmq_b1.prototxt"
  36. //#define RABBITMQ_PARAMETER_PATH_B2 "rabbitmq_b2.prototxt"
  37. //#define RABBITMQ_PARAMETER_PATH_B3 "rabbitmq_b3.prototxt"
  38. //#define RABBITMQ_PARAMETER_PATH_B4 "rabbitmq_b4.prototxt"
  39. //#define RABBITMQ_PARAMETER_PATH_B5 "rabbitmq_b5.prototxt"
  40. //#define RABBITMQ_PARAMETER_PATH_C1 "rabbitmq_c1.prototxt"
  41. //#define RABBITMQ_PARAMETER_PATH_C2 "rabbitmq_c2.prototxt"
  42. #define NETKORK_CONNECT_TIME 5 //连接时间, 单位秒
  43. #define NETKORK_RECONNECT_OVER_TIME 200 //重连超时判断的时间, 单位秒
  44. #define NETWORK_BUFFER_SIZE 1024 //接受缓存, 每帧最多 1024 byte
  45. //通信状态
  46. enum Network_status
  47. {
  48. NETWORK_STATUS_UNKNOW = 0, //通信状态 未知
  49. NETWORK_STATUS_READY = 1, //通信状态 正常
  50. NETWORK_STATUS_DISCONNECT = 11, //通信状态 断连(可能会在断连和重连之间反复跳动)
  51. NETWORK_STATUS_RECONNNECT = 12, //通信状态 重连(可能会在断连和重连之间反复跳动)
  52. NETWORK_STATUS_FAULT = 100, //通信状态 错误
  53. };
  54. ////网络连接模式
  55. // enum Network_mode
  56. // {
  57. // NETWORK_UNKNOWN = 0;
  58. // TCP_CLIENT = 1;
  59. // TCP_SERVER = 2;
  60. // UDP = 3;
  61. // }
  62. //
  63. ////单个网络连接参数
  64. // message Network_information
  65. // {
  66. // optional Network_mode network_mode = 1[default = NETWORK_UNKNOWN];
  67. // optional int32 socket_id = 2[default = 0]; //自定义的socket编号
  68. // optional string ip = 3[default = ""];
  69. // optional int32 port = 4[default = 0];
  70. // }
  71. //网络连接的 socket
  72. struct Network_socket
  73. {
  74. Network_status m_network_status; //每一个连接的状态
  75. int m_socket_fd; //系统自动分配的编号 socket_fd
  76. Network_proto::Network_information m_network_information; //单个网络连接参数
  77. std::chrono::system_clock::time_point m_updata_time; //通信更新时间
  78. };
  79. public:
  80. Network_base();
  81. Network_base(const Network_base& other)= default;
  82. Network_base& operator =(const Network_base& other)= default;
  83. ~Network_base();
  84. public://API functions
  85. //初始化 通信 模块。如下三选一
  86. Error_manager network_init();
  87. //初始化 通信 模块。从文件读取
  88. Error_manager network_init_from_protobuf(std::string prototxt_path);
  89. //初始化 通信 模块。从protobuf读取
  90. Error_manager network_init_from_protobuf(Network_proto::Network_parameter_all & network_parameter_all);
  91. //启动通信, run thread
  92. Error_manager network_run();
  93. //反初始化 通信 模块。
  94. Error_manager network_uninit();
  95. //重连, 快速uninit, init
  96. Error_manager network_reconnnect();
  97. public://get or set member variable
  98. void set_analysis_cycle_time(unsigned int analysis_cycle_time);
  99. void set_encapsulate_cycle_time(unsigned int encapsulate_cycle_time);
  100. protected://member functions
  101. bool set_block(int socket_fd, bool isblock); //设置阻塞模式 (希望只有在connect的时候是非阻塞的,而接收数据时候是阻塞的)
  102. int network_recv(int socket_fd, char *buf, int size); //接收数据
  103. int network_send(int socket_fd, const char *buf, int size); //发送数据
  104. bool is_connected(int socket_fd);//判断连接状态
  105. Error_manager check_and_reconnect(int socket_id);//检查网络,如果断连, 就立刻重连, socket_fd会重新分配新的
  106. protected://member functions
  107. //mp_receive_data_thread 接受线程执行函数,
  108. //receive_data_thread 内部线程负责接受消息
  109. void receive_data_thread();
  110. //检查消息是否有效, 主要检查消息类型和接受者, 判断这条消息是不是给我的.
  111. virtual Error_manager check_msg(Network_message* p_msg);
  112. //mp_analysis_data_thread 解析线程执行函数,
  113. //analysis_data_thread 内部线程负责解析消息
  114. void analysis_data_thread();
  115. //遍历接受链表, 解析消息,
  116. Error_manager analysis_receive_list();
  117. //检查执行者的状态, 判断能否处理这条消息, 需要子类重载
  118. virtual Error_manager check_executer(Network_message* p_msg);
  119. //处理消息, 需要子类重载
  120. virtual Error_manager execute_msg(Network_message* p_msg);
  121. //mp_send_data_thread 发送线程执行函数,
  122. //send_data_thread 内部线程负责发送消息
  123. void send_data_thread();
  124. //mp_encapsulate_data_thread 封装线程执行函数,
  125. //encapsulate_data_thread 内部线程负责封装消息
  126. void encapsulate_data_thread();
  127. //定时封装发送消息, 一般为心跳和状态信息, 需要子类重载
  128. virtual Error_manager auto_encapsulate_status();
  129. public:
  130. //封装消息, 需要子类重载
  131. virtual Error_manager encapsulate_msg(std::string message, int socket_id = 0);
  132. //封装消息, 需要子类重载
  133. virtual Error_manager encapsulate_msg(Network_message* p_msg);
  134. protected://member variable
  135. Network_status m_network_status; //通信总状态
  136. Network_proto::Network_parameter_all m_network_parameter_all; //配置文件导入参数
  137. std::map<int, Network_socket> m_network_socket_map; //网络连接配置, key是自定义的socket_id编号
  138. std::mutex m_mutex; // 数据锁
  139. //接受模块,
  140. Thread_safe_list<Network_message*> m_receive_data_list; //接受的list容器
  141. std::thread* mp_receive_data_thread; //接受的线程指针
  142. Thread_condition m_receive_condition; //接受的条件变量
  143. std::thread* mp_analysis_data_thread; //解析的线程指针
  144. Thread_condition m_analysis_data_condition; //解析的条件变量
  145. unsigned int m_analysis_cycle_time; //自动解析的时间周期
  146. //发送模块,
  147. Thread_safe_list<Network_message*> m_send_data_list; //发送的list容器
  148. std::thread* mp_send_data_thread; //发送的线程指针
  149. Thread_condition m_send_data_condition; //发送的条件变量
  150. std::thread* mp_encapsulate_data_thread; //封装的线程指针
  151. Thread_condition m_encapsulate_data_condition; //封装的条件变量
  152. unsigned int m_encapsulate_cycle_time; //自动封装的时间周期
  153. //回调函数,
  154. // //可以选择设置回调函数,或者子类继承重载,二选一.
  155. Error_manager (*check_msg_callback)(Network_message* p_msg);
  156. Error_manager (*check_executer_callback)(Network_message* p_msg);
  157. Error_manager (*execute_msg_callback)(Network_message* p_msg);
  158. Error_manager (*encapsulate_status_callback)();
  159. private:
  160. };
  161. #endif //NNXX_TESTS_NETWORK_BASE_H