提升::asio::async_read 不会在条件下停止

Boost::asio::async_read doesn't stop on condition

本文关键字:条件下 read asio async 提升      更新时间:2023-10-16

我有一些问题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)
                            );
}

下面是处理程序:

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();
    }
}

std::vector<char> m_inbound_data;
当客户端连接时,我在控制台上得到一个无限循环:

"Message received: "//没有消息跟踪

如果我打印数据长度,它总是0。

我连接到:telnet localhost 4242

有人知道为什么吗?不应该等待至少64个字符吗?

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

当你从一个std::vector<char>创建一个缓冲区时,缓冲区的大小就是向量的大小。

如果你不给它一个大小,它将是一个零长度的缓冲区。

如果缓冲区中至少有N个字节或缓冲区已满,则transfer_at_least函子返回true。在零长度缓冲区的情况下,它总是满的,所以它总是返回true。

配合道斐的回答:

你可以初始化一个char数组:

 char data[64]

或者,如果仍然想使用vector,可以将vector初始化为一定的大小:

std::vector<char> data(64)
           or
std::vector<char> data;
data.resize(64);