c++ - Boost::asio::async_read 不会按条件停止

标签 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)
                            );
}

这是处理程序:

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;

当客户端连接时,我在控制台上出现无限循环:

“收到消息:”//没有消息痕迹

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

我连接:telnet localhost 4242

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

最佳答案

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

当您从 std::vector<char> 创建缓冲区时,缓冲区的大小就是 vector 的大小。

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

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

关于c++ - Boost::asio::async_read 不会按条件停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5747317/

相关文章:

C++ 网络库需要内核堆栈

c++ - 获取第三方Click-Once应用的config文件夹

c++ - 模板类规范的简化

c++ - 将 vector 值放在链表中的节点上

c++ - 无法编译摩西(对 boost::... 的 undefined reference )

c++ - 亚洲 : how to pass object from one io context to another

c++ - C++ 我可以在这里使用数组来缩短我的代码吗?

c++ - 混合 Qt 和 Boost

c++ - 获取有关 boost::any 中包含的类型的信息

c++ - 通过代理服务器提升 asio 套接字连接