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::vectorBoost.Asio 永远不会调整缓冲区的大小。
当您从std::vector<char>
创建缓冲区时,缓冲区的大小就是向量的大小。
如果你不给它一个大小,它将是一个长度为零的缓冲区。
如果缓冲区中至少有 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 无限循环,接收数据为零字节