Boost :: asio :: async_read不会因条件而停止

The*_*uad 3 c++ boost boost-asio

我对boost :: asio :: async_read有一些问题

这是我的代码

void TCPConnection::listenForRead() {

    boost::asio::async_read(m_socket, 
                            boost::asio::buffer(m_inbound_data),
                            boost::asio::transfer_at_least(64),
                            boost::bind(&TCPConnection::handle_read, 
                                        shared_from_this(),
                                        boost::asio::placeholders::error)
                            );
}
Run Code Online (Sandbox Code Playgroud)

这是处理程序:

void TCPConnection::handle_read(const boost::system::error_code& error) {
    if (error) {
        std::cout << "Error read: " << error.category().name() << " -- " << error.value() << std::endl;
    } else {

        std::string archive_data(&m_inbound_data[0], m_inbound_data.size()); 

        std::cout << "Message received: " << archive_data << std::endl;
        listenForRead();
    }
}
Run Code Online (Sandbox Code Playgroud)

std::vector<char> m_inbound_data;
Run Code Online (Sandbox Code Playgroud)

当客户端连接时,我在控制台上得到一个无限循环:

"收到消息:"//没有消息的痕迹

如果我打印数据长度,它始终为0.

我连接:telnet localhost 4242

谁知道为什么?它不应该等待至少64个字符?

Col*_*nee 6

Boost.Asio永远不会调整你的缓冲区大小.

从a创建缓冲区时std::vector<char>,缓冲区的大小是向量的大小.

如果你没有给它一个大小,它将是一个零长度的缓冲区.

所述transfer_at_least如果任一至少N个字节是在缓冲器函子返回true或缓冲器满.在长度为零的缓冲区的情况下,它总是满的,所以它总是返回true.