2#include <ossia/network/context.hpp>
3#include <ossia/network/sockets/configuration.hpp>
5#include <boost/asio/io_context.hpp>
6#include <boost/asio/ip/tcp.hpp>
7#include <boost/asio/ip/udp.hpp>
8#include <boost/asio/local/datagram_protocol.hpp>
9#include <boost/asio/placeholders.hpp>
10#include <boost/asio/strand.hpp>
11#include <boost/asio/write.hpp>
13#include <nano_signal_slot.hpp>
20 using proto = boost::asio::ip::tcp;
21 using socket =
typename proto::socket;
23 tcp_listener() =
delete;
24 tcp_listener(
const tcp_listener&) =
delete;
25 tcp_listener& operator=(
const tcp_listener&) =
delete;
26 tcp_listener(tcp_listener&&) =
default;
27 tcp_listener& operator=(tcp_listener&&) =
default;
28 explicit tcp_listener(proto::socket sock)
29 : m_socket{std::move(sock)}
35 m_socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
39 void write(
const boost::asio::const_buffer& buf)
41 boost::system::error_code ec;
42 boost::asio::write(m_socket, buf, ec);
49 proto::socket m_socket;
55 using proto = boost::asio::ip::tcp;
56 using socket =
typename proto::socket;
57 using listener = tcp_listener;
59 tcp_server(
const inbound_socket_configuration& conf, boost::asio::io_context& ctx)
62 boost::asio::make_strand(ctx),
63 proto::endpoint{boost::asio::ip::make_address(conf.bind), conf.port}}
68 const inbound_socket_configuration& conf, ossia::net::network_context_ptr ctx)
69 : tcp_server{conf, ctx->context}
73 boost::asio::io_context& m_context;
74 proto::acceptor m_acceptor;
80 using proto = boost::asio::ip::tcp;
81 using socket =
typename proto::socket;
83 tcp_client(
const outbound_socket_configuration& conf, boost::asio::io_context& ctx)
85 , m_endpoint{boost::asio::ip::make_address(conf.host), conf.port}
86 , m_socket{boost::asio::make_strand(ctx)}
92 boost::system::error_code ec;
93 m_socket.set_option(boost::asio::ip::tcp::no_delay{
true}, ec);
94 m_socket.set_option(boost::asio::socket_base::reuse_address{
true}, ec);
96 m_socket.async_connect(
97 m_endpoint, [
this](
const boost::system::error_code& ec,
auto&&...) {
98 if(m_socket.is_open() && !ec)
106 puts(ec.message().c_str());
112 bool connected()
const {
return m_connected; }
116 boost::asio::post(m_context, [
this] {
117 m_socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
123 void write(
const char* data, std::size_t sz)
125 boost::system::error_code ec;
126 boost::asio::write(m_socket, boost::asio::const_buffer(data, sz), ec);
129 Nano::Signal<void()> on_open;
130 Nano::Signal<void()> on_close;
131 Nano::Signal<void()> on_fail;
133 boost::asio::io_context& m_context;
134 proto::endpoint m_endpoint;
135 proto::socket m_socket;
136 bool m_connected{
false};