boost::asio асинхронное ожидание данных на сокете

class Socket : public std::enable_shared_from_this<Socket>
{
public:
    Socket(boost::asio::io_context& ioContex)
        : m_socket(ioContex)
    {
    }    
    void start()
    {
        auto readHandler = std::bind(&Socket::onRead,
                                     shared_from_this(),
                                     std::placeholders::_1,
                                     std::placeholders::_2);

        boost::asio::async_read(m_socket, boost::asio::buffer(m_socketBuf), std::move(readHandler));
    }
    
private:
    void onRead(const boost::system::error_code& error, size_t msgSize)
    {
        if (msgSize != 0)
        {
            parseBuf();
            m_socketBuf.clear();
        }
        start();
    }
    
private:
    boost::asio::ip::tcp::socket m_socket;
    std::string m_socketBuf;
};


//using
boost::asio::io_context ioContex;
auto socketPtr = std::make_shaed<Socket>(ioContex);
socketPtr->start();
ioContex.run();

Как правильно ожидать данные на сокете асинхронно? В приведенном примере onRead(...) вызывается бесконечно с нулевым msgSize


Ответы (1 шт):

Автор решения: Ivan Sodorenko

Проблема оказалась в нулевом размере приемного буфера.

void start()
{
    m_socketBuf.resize(1024); // here
    auto readHandler = std::bind(&Socket::onRead,
                                 shared_from_this(),
                                 std::placeholders::_1,
                                 std::placeholders::_2);
    
    boost::asio::async_read(m_socket, boost::asio::buffer(m_socketBuf), std::move(readHandler));
}
→ Ссылка