3 #include <boost/asio.hpp> 4 #include <boost/archive/text_iarchive.hpp> 5 #include <boost/archive/text_oarchive.hpp> 15 boost::asio::ip::tcp::socket socket;
16 constexpr
static int HEADER_LENGTH = 8;
18 std::string create_outbound_header(
int header)
20 std::ostringstream header_stream;
21 header_stream << std::setw(HEADER_LENGTH)
24 if (!header_stream || header_stream.str().size() != HEADER_LENGTH)
25 throw std::runtime_error(
"bad header");
26 return header_stream.str();
30 : socket(std::move(socket))
41 boost::system::error_code ec;
42 socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
52 void async_write(
const T& t, boost::asio::yield_context yield)
54 std::ostringstream archive_stream;
55 boost::archive::text_oarchive archive(archive_stream);
57 std::string outbound_data = archive_stream.str();
58 std::string outbound_header = create_outbound_header(outbound_data.size());
59 std::vector<boost::asio::const_buffer> buffers;
60 buffers.push_back(boost::asio::buffer(outbound_header));
61 buffers.push_back(boost::asio::buffer(outbound_data));
62 boost::asio::async_write(socket, buffers, yield);
68 char inbound_header[HEADER_LENGTH];
69 boost::asio::async_read(socket, boost::asio::buffer(inbound_header, HEADER_LENGTH), yield);
70 std::istringstream is(std::string(inbound_header, HEADER_LENGTH));
72 if (!(is >> std::hex >> size))
74 throw std::runtime_error(
"bad header");
76 std::vector<char> inbound_data(size);
77 boost::asio::async_read(socket, boost::asio::buffer(inbound_data), yield);
78 std::string archive_data(&inbound_data[0], inbound_data.size());
79 std::istringstream archive_stream(archive_data);
80 boost::archive::text_iarchive archive(archive_stream);
void async_read(T &t, boost::asio::yield_context yield)
Definition: connection.hpp:66
connection(boost::asio::ip::tcp::socket socket)
Definition: connection.hpp:29
boost::asio::ip::tcp::socket & get_socket()
Definition: connection.hpp:46
void close()
Definition: connection.hpp:39
void async_write(const T &t, boost::asio::yield_context yield)
Definition: connection.hpp:52
Definition: connection.hpp:13
std::shared_ptr< connection > connection_ptr
Definition: connection.hpp:85
~connection()
Definition: connection.hpp:34