void tcp_client::async_read(void) { m_io_service.async_read(m_fd, m_read_buffer, READ_SIZE, [&](std::size_t length) { if (m_receive_handler) if (not m_receive_handler(*this, { m_read_buffer.begin(), m_read_buffer.begin() + length })) { disconnect(); return ; } //! clear read buffer keep waiting for incoming bytes m_read_buffer.clear(); if (m_is_connected) async_read(); }); }
void tcp_client::async_read(void) { boost::asio::async_read(m_socket, boost::asio::buffer(m_read_buffer.data(), READ_SIZE), [](const boost::system::error_code& error, std::size_t bytes) -> std::size_t { //! break if bytes have been received, continue otherwise return error or bytes ? 0 : READ_SIZE; }, [=](boost::system::error_code error, std::size_t length) { if (error) { process_disconnection(); return ; } std::lock_guard<std::mutex> lock(m_receive_handler_mutex); if (m_receive_handler) if (not m_receive_handler(*this, { m_read_buffer.begin(), m_read_buffer.begin() + length })) { process_disconnection(); return ; } //! keep waiting for incoming bytes async_read(); }); }