Conscience Core
TcpClient.h
Go to the documentation of this file.
1 
2 #ifndef TcpClient_H
3 #define TcpClient_H
4 
5 #include "AsioContext.h"
6 #include "CscCommon.h"
7 
8 using namespace conscience_utils::logging;
9 
11 
12  class TcpClientRuntimeError : public runtime_error {
13  public:
14  TcpClientRuntimeError(const string &message) : runtime_error(message.c_str()) {}
15  };
16 
17  class TcpClient {
18  public:
22  TcpClient(const string &ipAddress, unsigned int port);
23 
24  struct ExistingSocket {
25  void * socket = nullptr;
26  AsioContext *asioContext = nullptr;
27 
31  ExistingSocket(void *socket, AsioContext *asioContext);
32  };
37  TcpClient(const ExistingSocket &existingSocket, bool releaseAsioContext = false);
38  ~TcpClient();
39 
40  string getIpAddress() const;
41  unsigned int getPort() const;
45  optional<vector<unsigned char>*> send(const vector<unsigned char> *bytes, bool noResponse = false, bool close = false);
46  optional<vector<unsigned char>*> receive();
47 
48  void release();
49  bool isReleased() const;
50 
54  optional<unsigned int> getTimeout() const;
55 
60  void setTimeout(unsigned timeoutSeconds);
61 
65  void scheduleCloseAfterTimeout();
69  void cancelCloseAfterTimeout();
70 
71  class AsioState {
72  public:
73  bool closing = false;
74  void *socket = nullptr;
75  void *closeAfterTimeoutTimer = nullptr;
76  void *strand = nullptr;
77  AsioContext *asioContext = nullptr;
78  bool releaseAsioContext = true;
80  AsioState(void *socket, AsioContext *asioContext, bool releaseAsioContext, const string &loggerCategory);
81  ~AsioState();
82  };
83  private:
84  inline static std::atomic<unsigned long long> counter = 0;
85  string loggerCategory = "TcpClient_" + to_string(++counter);
86  unique_ptr<CscLogger> logger = CscLogger::getForCategory(loggerCategory);
87 
88 
89  // IMPORTANT: do not touch this shared ptr. Boost ASIO lifecycle is very tricky and we NEED this shared ptr to clean close
90  ptr<AsioState> asioState = nullptr;
91  const string ipAddress = "";
92  optional<unsigned> timeoutSeconds = {};
93 
94  bool released = false;
95 
96  vector<unsigned char> bufferedBytes;
97 
98 
99 
100 
101  };
102 }
103 #endif
nlohmann::to_string
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
Definition: json.hpp:26470
conscience_core::communication::AsioContext
Definition: AsioContext.h:20
conscience_core::communication::TcpClient
Definition: TcpClient.h:17
conscience_core::communication::TcpClientRuntimeError
Definition: TcpClient.h:12
AsioContext.h
conscience_core::communication::TcpClient::ExistingSocket
Definition: TcpClient.h:24
conscience_core::communication::TcpClient::AsioState::loggerCategory
string loggerCategory
Definition: TcpClient.h:79
logger
static std::unique_ptr< CscLogger > logger
Definition: gltfHelpers.cpp:6
conscience_utils::logging
Definition: conscience_log.cpp:20
conscience_utils::logging::CscLogger::getForCategory
static unique_ptr< CscLogger > getForCategory(string category)
Definition: conscience_log.cpp:119
CscCommon.h
conscience_core::communication::TcpClient::AsioState
Definition: TcpClient.h:71
conscience_core::communication
Definition: CscEntityClient.h:6
conscience_core::communication::TcpClientRuntimeError::TcpClientRuntimeError
TcpClientRuntimeError(const string &message)
Definition: TcpClient.h:14
ptr
std::shared_ptr< T > ptr
Definition: CscCommon.h:29