OpenCBDC Transaction Processor
Loading...
Searching...
No Matches
tcp_server.hpp
Go to the documentation of this file.
1// Copyright (c) 2021 MIT Digital Currency Initiative,
2// Federal Reserve Bank of Boston
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#ifndef OPENCBDC_TX_SRC_RPC_TCP_SERVER_H_
7#define OPENCBDC_TX_SRC_RPC_TCP_SERVER_H_
8
9#include "async_server.hpp"
10#include "blocking_server.hpp"
11#include "server.hpp"
13
14namespace cbdc::rpc {
19 template<typename Server>
20 class tcp_server : public Server {
21 public:
24 explicit tcp_server(network::endpoint_t listen_endpoint)
25 : m_net(std::make_shared<network::connection_manager>()),
26 m_listen_endpoint(std::move(listen_endpoint)) {}
27
29 auto operator=(tcp_server&&) -> tcp_server& = delete;
30 tcp_server(const tcp_server&) = delete;
31 auto operator=(const tcp_server&) -> tcp_server& = delete;
32
35 ~tcp_server() override {
36 m_net->close();
37 if(m_handler_thread.joinable()) {
38 m_handler_thread.join();
39 }
40 }
41
46 [[nodiscard]] auto init() -> bool {
47 auto handler_thread = m_net->start_server(
48 m_listen_endpoint,
49 [&](network::message_t&& msg) -> std::optional<cbdc::buffer> {
50 auto ret = std::optional<cbdc::buffer>();
51 if constexpr(Server::handler == handler_type::async) {
52 ret = Server::async_call(
53 std::move(*msg.m_pkt),
54 [&, peer_id = msg.m_peer_id, net = m_net](
55 cbdc::buffer resp) {
56 auto resp_ptr = std::make_shared<cbdc::buffer>(
57 std::move(resp));
58 net->send(resp_ptr, peer_id);
59 });
60 } else {
61 ret = Server::blocking_call(std::move(*msg.m_pkt));
62 }
63
64 return ret;
65 });
66
67 if(!handler_thread.has_value()) {
68 return false;
69 }
70
71 m_handler_thread = std::move(handler_thread.value());
72
73 return true;
74 }
75
76 private:
77 std::shared_ptr<network::connection_manager> m_net;
78 network::endpoint_t m_listen_endpoint;
79 std::thread m_handler_thread;
80 };
81
83 template<typename Request, typename Response>
85
87 template<typename Request, typename Response>
89}
90
91#endif
Buffer to store and retrieve byte data.
Definition buffer.hpp:15
Implements an RPC server over a TCP socket.
auto operator=(tcp_server &&) -> tcp_server &=delete
tcp_server(tcp_server &&)=delete
tcp_server(network::endpoint_t listen_endpoint)
Constructor.
~tcp_server() override
Destructor.
auto operator=(const tcp_server &) -> tcp_server &=delete
auto init() -> bool
Initializes the server.
tcp_server(const tcp_server &)=delete
std::pair< ip_address, port_number_t > endpoint_t
[host name, port number].
Definition socket.hpp:19
Received message type.