Boost::asio::async_read 不会在条件下停止

Posted

技术标签:

【中文标题】Boost::asio::async_read 不会在条件下停止【英文标题】:Boost::asio::async_read doesn't stop on condition 【发布时间】:2011-04-21 17:00:29 【问题描述】:

我对 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 个字符吗?

【问题讨论】:

m_inbound_data的类型是什么,大小是多少 std::vector m_inbound_data; 【参考方案1】:

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

当您从std::vector&lt;char&gt; 创建缓冲区时,缓冲区的大小就是向量的大小。

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

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

【讨论】:

谢谢!使用 char data[64] 它确实在等待。【参考方案2】:

同意 dauphic 的回答:

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

 char data[64]

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

std::vector<char> data(64)

           or

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

【讨论】:

以上是关于Boost::asio::async_read 不会在条件下停止的主要内容,如果未能解决你的问题,请参考以下文章

Boost::asio::async_read 不会在条件下停止

优雅地取消 boost::asio::async_read

boost::asio::async_read 无限循环,接收数据为零字节

如何在到达终止字符时返回 boost::asio::async_read

boost asio async_read中的随机EOF

boost::asio::async_read 在接收到完整的 Content-Length 之前接收 EOF