async_client.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #ifndef ASYNC_CLIENT_H
  2. #define ASYNC_CLIENT_H
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include <time.h>
  6. #include <boost/asio.hpp>
  7. #include <boost/bind.hpp>
  8. #include <boost/thread.hpp>
  9. #include <chrono>
  10. #include <mutex>
  11. #include <thread>
  12. #include <atomic>
  13. #include <string>
  14. #include <unistd.h>
  15. #include "glog/logging.h"
  16. // using namespace std ;
  17. // using boost::asio::ip::udp;
  18. // using boost::asio::ip::tcp;
  19. // using namespace boost::asio;
  20. #define MAX_LENGTH 50000
  21. #define READ_TIMEOUT_MILLISECONDS 5000
  22. typedef void (*fundata_t)(const char *data, const int len, const void *p);
  23. /**
  24. * 异步tcp通信客户端
  25. * */
  26. class Async_Client
  27. {
  28. public:
  29. // 有参构造
  30. Async_Client(boost::asio::io_service &io_service, boost::asio::ip::tcp::endpoint endpoint, fundata_t fundata_, void *p);
  31. // 析构
  32. ~Async_Client();
  33. // 连接状态返回
  34. bool client_connection_status();
  35. // 初始化状态返回
  36. bool client_initialize_status();
  37. // 初始化
  38. bool initialize(bool with_reconnection = true);
  39. // 关闭
  40. bool close();
  41. private:
  42. // 连接检查线程函数
  43. static void connection_check(Async_Client *p);
  44. // 连接
  45. void socket_connect();
  46. // 关闭连接
  47. void socket_close();
  48. // 重新设置连接
  49. void socket_reconnect();
  50. // 异步写入
  51. void client_async_write(char *buf, int len);
  52. // 异步读取
  53. void client_async_read();
  54. // 异步读回调
  55. void handle_read(const boost::system::error_code &error,
  56. size_t bytes_transferred);
  57. // 异步写回调
  58. void handle_write(const boost::system::error_code &error);
  59. // 异步连接回调
  60. void handle_connect(const boost::system::error_code &error);
  61. boost::asio::io_service &iosev; // 异步控制服务
  62. boost::asio::ip::tcp::socket socket; // socket句柄
  63. boost::asio::ip::tcp::endpoint m_ep; // 连接参数
  64. char m_origin_data_[MAX_LENGTH]; // 原始数据
  65. // std::mutex m_data_mutex; // 原始数据访问锁, 顺序执行,无需加锁
  66. std::atomic<bool> mb_with_reconnection; // 开启自动重连
  67. std::atomic<bool> mb_connected; // 连接状态
  68. std::atomic<bool> mb_initialized; // 初始化是否成功
  69. fundata_t m_fundata; // 数据处理回调
  70. void *mp_handle; // 外部句柄
  71. std::chrono::steady_clock::time_point m_last_read_time; //最后一次读取时间
  72. std::thread *m_connection_check_thread; // 连接状态主动检查线程
  73. public:
  74. std::atomic<bool> mb_exit; // 系统是否需要关闭
  75. };
  76. #endif // ASYNC_CLIENT_H