2#include <ossia/network/sockets/cobs_framing.hpp>
3#include <ossia/network/sockets/fixed_length_framing.hpp>
4#include <ossia/network/sockets/size_prefix_framing.hpp>
5#include <ossia/network/sockets/slip_framing.hpp>
6#include <ossia/network/sockets/stx_etx_framing.hpp>
7#include <ossia/network/sockets/tcp_socket.hpp>
8#include <ossia/network/sockets/udp_socket.hpp>
9#include <ossia/network/sockets/unix_socket.hpp>
10#include <ossia/network/sockets/var_size_prefix_framing.hpp>
11#include <ossia/network/sockets/writers.hpp>
16template <
typename Base,
typename Framing>
17struct framed_listener :
public Base
19 using proto =
typename Base::proto;
20 using socket =
typename proto::socket;
21 using decoder =
typename Framing::template decoder<socket>;
24 framed_listener(socket&& sock, F f)
25 : Base{std::move(sock)}
26 , m_decoder{this->m_socket}
28 m_decoder.receive(stream_processor<framed_listener, F>{*
this, std::move(f)});
34template <
typename Base,
typename Framing>
35struct framed_server : Base
38 using proto =
typename Base::proto;
39 using socket =
typename proto::socket;
40 using listener = framed_listener<typename Base::listener, Framing>;
42 typename Framing::template encoder<multi_socket_writer<std::unique_ptr<listener>>>;
43 using decoder =
typename Framing::template decoder<socket>;
45 template <
typename... Args>
46 framed_server(Args&&... args)
47 : Base{std::forward<Args>(args)...}
56 this->m_context.post([
this, f] {
57 for(
auto& sock : m_sockets)
68 this->m_acceptor.async_accept(
69 [
this, f = std::move(f)](std::error_code ec, socket socket) {
72 m_sockets.push_back(std::make_unique<listener>(std::move(socket), f));
79 void write(
const char* data, std::size_t sz)
81 m_encoder.write(data, sz);
84 std::vector<std::unique_ptr<listener>> m_sockets;
85 multi_socket_writer<std::unique_ptr<listener>> m_writer;
89template <
typename Base,
typename Framing>
90struct framed_client : Base
92 using socket =
typename Base::socket;
93 using encoder =
typename Framing::template encoder<socket>;
94 using decoder =
typename Framing::template decoder<socket>;
96 template <
typename... Args>
97 framed_client(Args&&... args)
98 : Base{std::forward<Args>(args)...}
99 , m_encoder{this->m_socket}
100 , m_decoder{this->m_socket}
104 template <
typename F>
107 m_decoder.receive(stream_processor<framed_client, F>{*
this, std::move(f)});
110 void write(
const char* data, std::size_t sz)
112 m_encoder.write(data, sz);
119template <
typename Base,
typename Framing>
120struct framed_socket : Base
122 using socket =
typename Base::socket;
123 using encoder =
typename Framing::template encoder<socket>;
124 using decoder =
typename Framing::template decoder<socket>;
126 template <
typename... Args>
127 framed_socket(Args&&... args)
128 : Base{std::forward<Args>(args)...}
129 , m_encoder{this->m_socket}
130 , m_decoder{this->m_socket}
134 template <
typename F>
138 m_decoder.receive(stream_processor<framed_socket, F>{*
this, std::move(f)});
141 template <
typename F>
144 m_decoder.receive(stream_processor<framed_socket, F>{*
this, std::move(f)});
147 void write(
const char* data, std::size_t sz)
149 m_encoder.write(data, sz);
156struct tcp_size_prefix_server : framed_server<tcp_server, size_prefix_framing>
158 using framed_server::framed_server;
160struct tcp_slip_server : framed_server<tcp_server, slip_framing>
162 using framed_server::framed_server;
165struct tcp_size_prefix_client : framed_client<tcp_client, size_prefix_framing>
167 using framed_client::framed_client;
169struct tcp_slip_client : framed_client<tcp_client, slip_framing>
171 using framed_client::framed_client;
173struct tcp_cobs_client : framed_client<tcp_client, cobs_framing>
175 using framed_client::framed_client;
177struct tcp_cobs_server : framed_server<tcp_server, cobs_framing>
179 using framed_server::framed_server;
182#if defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
183struct unix_stream_size_prefix_server
184 : framed_server<unix_stream_server, size_prefix_framing>
186 using framed_server::framed_server;
188struct unix_stream_slip_server : framed_server<unix_stream_server, slip_framing>
190 using framed_server::framed_server;
192struct unix_stream_cobs_server : framed_server<unix_stream_server, cobs_framing>
194 using framed_server::framed_server;
197struct unix_stream_size_prefix_client
198 : framed_socket<unix_stream_client, size_prefix_framing>
200 using framed_socket::framed_socket;
202struct unix_stream_slip_client : framed_socket<unix_stream_client, slip_framing>
204 using framed_socket::framed_socket;
206struct unix_stream_cobs_client : framed_socket<unix_stream_client, cobs_framing>
208 using framed_socket::framed_socket;