Код: Выделить всё
template
class io : public std::enable_shared_from_this
{
public:
io(socket_t socket) : m_socket(std::move(socket)) {}
void start()
{
read();
}
void write(std::string data)
{
bool write_in_progress = !m_write_queue.empty();
m_write_queue.push(std::move(data));
if (!write_in_progress)
{
do_write();
}
}
void close()
{
m_socket.close();
}
private:
socket_t m_socket;
std::array m_buffer;
std::queue m_write_queue;
void read()
{
auto self = this->shared_from_this();
m_socket.async_read_some(boost::asio::buffer(m_buffer),
[this, self](boost::system::error_code ec, std::size_t bytes_transferred)
{
if (!ec)
{
std::string data(m_buffer.data(), bytes_transferred);
read();
}
});
}
void do_write()
{
auto self = this->shared_from_this();
boost::asio::async_write(m_socket, boost::asio::buffer(m_write_queue.front().c_str(), m_write_queue.front().size()),
[this, self](boost::system::error_code ec, std::size_t /*length*/)
{
if (!ec)
{
m_write_queue.pop();
if (!m_write_queue.empty())
{
do_write();
}
}
});
}
};
Подробнее здесь: https://stackoverflow.com/questions/796 ... cketstream