diff --git a/.gitignore b/.gitignore index cdd81d5d..a21f71d9 100644 --- a/.gitignore +++ b/.gitignore @@ -66,5 +66,7 @@ compile_commands.json notes.txt sanitizer-suppressions.txt snapserver.conf +certs +server/etc/certs extras/package/debian/snap*.debhelper.log diff --git a/client/client_connection.cpp b/client/client_connection.cpp index db160c3e..603c3d43 100644 --- a/client/client_connection.cpp +++ b/client/client_connection.cpp @@ -29,6 +29,7 @@ #include // standard headers +#include #include @@ -91,8 +92,8 @@ bool PendingRequest::operator<(const PendingRequest& other) const -ClientConnection::ClientConnection(boost::asio::io_context& io_context, const ClientSettings::Server& server) - : strand_(boost::asio::make_strand(io_context.get_executor())), resolver_(strand_), socket_(strand_), reqId_(1), server_(server) +ClientConnection::ClientConnection(boost::asio::io_context& io_context, ClientSettings::Server server) + : strand_(boost::asio::make_strand(io_context.get_executor())), resolver_(strand_), socket_(strand_), reqId_(1), server_(std::move(server)) { base_msg_size_ = base_message_.getSize(); buffer_.resize(base_msg_size_); @@ -247,10 +248,11 @@ void ClientConnection::sendRequest(const msg::message_ptr& message, const chrono boost::asio::post(strand_, [this, message, timeout, handler]() { pendingRequests_.erase( - std::remove_if(pendingRequests_.begin(), pendingRequests_.end(), [](std::weak_ptr request) { return request.expired(); }), + std::remove_if(pendingRequests_.begin(), pendingRequests_.end(), [](const std::weak_ptr& request) { return request.expired(); }), pendingRequests_.end()); unique_ptr response(nullptr); - if (++reqId_ >= 10000) + static constexpr uint16_t max_req_id = 10000; + if (++reqId_ >= max_req_id) reqId_ = 1; message->id = reqId_; auto request = make_shared(strand_, reqId_, handler); diff --git a/client/client_connection.hpp b/client/client_connection.hpp index 62843888..5298637e 100644 --- a/client/client_connection.hpp +++ b/client/client_connection.hpp @@ -83,10 +83,11 @@ private: class ClientConnection { public: + /// Result callback with boost::error_code using ResultHandler = std::function; /// c'tor - ClientConnection(boost::asio::io_context& io_context, const ClientSettings::Server& server); + ClientConnection(boost::asio::io_context& io_context, ClientSettings::Server server); /// d'tor virtual ~ClientConnection(); @@ -122,6 +123,7 @@ public: }); } + /// @return MAC address of the client std::string getMacAddress(); /// async get the next message @@ -129,26 +131,42 @@ public: void getNextMessage(const MessageHandler& handler); protected: + /// Send next pending message from messages_ void sendNext(); + /// Base message holding the received message msg::BaseMessage base_message_; + /// Receive buffer std::vector buffer_; + /// Size of a base message (= message header) size_t base_msg_size_; + /// Strand to serialize send/receive boost::asio::strand strand_; + /// TCP resolver tcp::resolver resolver_; + /// TCP socket tcp::socket socket_; + /// List of pending requests, waiting for a response (Message::refersTo) std::vector> pendingRequests_; + /// unique request id to match a response uint16_t reqId_; + /// Server settings (host and port) ClientSettings::Server server_; + /// A pending request struct PendingMessage { - PendingMessage(const msg::message_ptr& msg, ResultHandler handler) : msg(msg), handler(handler) + /// C'tor + PendingMessage(msg::message_ptr msg, ResultHandler handler) : msg(std::move(msg)), handler(std::move(handler)) { } + /// Pointer to the request msg::message_ptr msg; + /// Response handler ResultHandler handler; }; + + /// Pending messages to be sent std::deque messages_; };