network_base.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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. #define NETKORK_CONNECT_TIME 5 //连接时间, 单位秒
  31. #define NETKORK_RECONNECT_OVER_TIME 2 //重连超时判断的时间, 单位秒
  32. #define NETWORK_BUFFER_SIZE 1024 //接受缓存, 每帧最多 1024 byte
  33. //通信状态
  34. enum Network_status
  35. {
  36. NETWORK_STATUS_UNKNOW = 0, //通信状态 未知
  37. NETWORK_STATUS_READY = 1, //通信状态 正常
  38. NETWORK_STATUS_DISCONNECT = 11, //通信状态 断连(可能会在断连和重连之间反复跳动)
  39. NETWORK_STATUS_RECONNNECT = 12, //通信状态 重连(可能会在断连和重连之间反复跳动)
  40. NETWORK_STATUS_FAULT = 100, //通信状态 错误
  41. };
  42. ////网络连接模式
  43. // enum Network_mode
  44. // {
  45. // NETWORK_UNKNOWN = 0;
  46. // TCP_CLIENT = 1;
  47. // TCP_SERVER = 2;
  48. // UDP = 3;
  49. // }
  50. //
  51. ////单个网络连接参数
  52. // message Network_information
  53. // {
  54. // optional Network_mode network_mode = 1[default = NETWORK_UNKNOWN];
  55. // optional int32 socket_id = 2[default = 0]; //自定义的socket编号
  56. // optional string ip = 3[default = ""];
  57. // optional int32 port = 4[default = 0];
  58. // }
  59. //网络连接的 socket
  60. struct Network_socket
  61. {
  62. Network_status m_network_status; //每一个连接的状态
  63. int m_socket_fd; //系统自动分配的编号 socket_fd
  64. Network_proto::Network_information m_network_information; //单个网络连接参数
  65. std::chrono::system_clock::time_point m_updata_time; //通信更新时间
  66. };
  67. public:
  68. Network_base();
  69. Network_base(const Network_base& other)= default;
  70. Network_base& operator =(const Network_base& other)= default;
  71. ~Network_base();
  72. public://API functions
  73. //初始化 通信 模块。如下三选一
  74. Error_manager network_init();
  75. //初始化 通信 模块。从文件读取
  76. Error_manager network_init_from_protobuf(std::string prototxt_path);
  77. //初始化 通信 模块。从protobuf读取
  78. Error_manager network_init_from_protobuf(Network_proto::Network_parameter_all & network_parameter_all);
  79. //启动通信, run thread
  80. Error_manager network_run();
  81. //反初始化 通信 模块。
  82. Error_manager network_uninit();
  83. //重连, 快速uninit, init
  84. Error_manager network_reconnnect();
  85. public://get or set member variable
  86. void set_analysis_cycle_time(unsigned int analysis_cycle_time);
  87. void set_encapsulate_cycle_time(unsigned int encapsulate_cycle_time);
  88. protected://member functions
  89. bool set_block(int socket_fd, bool isblock); //设置阻塞模式 (希望只有在connect的时候是非阻塞的,而接收数据时候是阻塞的)
  90. int network_recv(int socket_fd, char *buf, int size); //接收数据
  91. int network_send(int socket_fd, const char *buf, int size); //发送数据
  92. bool is_connected(int socket_fd);//判断连接状态
  93. Error_manager check_and_reconnect(int socket_id);//检查网络,如果断连, 就立刻重连, socket_fd会重新分配新的
  94. protected://member functions
  95. //mp_receive_data_thread 接受线程执行函数,
  96. //receive_data_thread 内部线程负责接受消息
  97. void receive_data_thread();
  98. //检查消息是否有效, 主要检查消息类型和接受者, 判断这条消息是不是给我的.
  99. virtual Error_manager check_msg(Network_message* p_msg);
  100. //mp_analysis_data_thread 解析线程执行函数,
  101. //analysis_data_thread 内部线程负责解析消息
  102. void analysis_data_thread();
  103. //遍历接受链表, 解析消息,
  104. Error_manager analysis_receive_list();
  105. //检查执行者的状态, 判断能否处理这条消息, 需要子类重载
  106. virtual Error_manager check_executer(Network_message* p_msg);
  107. //处理消息, 需要子类重载
  108. virtual Error_manager execute_msg(Network_message* p_msg);
  109. //mp_send_data_thread 发送线程执行函数,
  110. //send_data_thread 内部线程负责发送消息
  111. void send_data_thread();
  112. //mp_encapsulate_data_thread 封装线程执行函数,
  113. //encapsulate_data_thread 内部线程负责封装消息
  114. void encapsulate_data_thread();
  115. //定时封装发送消息, 一般为心跳和状态信息, 需要子类重载
  116. virtual Error_manager auto_encapsulate_status();
  117. public:
  118. //封装消息, 需要子类重载
  119. virtual Error_manager encapsulate_msg(std::string message, int socket_id = 0);
  120. //封装消息, 需要子类重载
  121. virtual Error_manager encapsulate_msg(Network_message* p_msg);
  122. protected://member variable
  123. Network_status m_network_status; //通信总状态
  124. Network_proto::Network_parameter_all m_network_parameter_all; //配置文件导入参数
  125. std::map<int, Network_socket> m_network_socket_map; //网络连接配置, key是自定义的socket_id编号
  126. std::mutex m_mutex; // 数据锁
  127. //接受模块,
  128. Thread_safe_list<Network_message*> m_receive_data_list; //接受的list容器
  129. std::thread* mp_receive_data_thread; //接受的线程指针
  130. Thread_condition m_receive_condition; //接受的条件变量
  131. std::thread* mp_analysis_data_thread; //解析的线程指针
  132. Thread_condition m_analysis_data_condition; //解析的条件变量
  133. unsigned int m_analysis_cycle_time; //自动解析的时间周期
  134. //发送模块,
  135. Thread_safe_list<Network_message*> m_send_data_list; //发送的list容器
  136. std::thread* mp_send_data_thread; //发送的线程指针
  137. Thread_condition m_send_data_condition; //发送的条件变量
  138. std::thread* mp_encapsulate_data_thread; //封装的线程指针
  139. Thread_condition m_encapsulate_data_condition; //封装的条件变量
  140. unsigned int m_encapsulate_cycle_time; //自动封装的时间周期
  141. //回调函数,
  142. // //可以选择设置回调函数,或者子类继承重载,二选一.
  143. Error_manager (*check_msg_callback)(Network_message* p_msg);
  144. Error_manager (*check_executer_callback)(Network_message* p_msg);
  145. Error_manager (*execute_msg_callback)(Network_message* p_msg);
  146. Error_manager (*encapsulate_status_callback)();
  147. private:
  148. };
  149. #endif //NNXX_TESTS_NETWORK_BASE_H