我对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个字符?
答案 0 :(得分:6)
Boost.Asio永远不会调整你的缓冲区大小。
从std::vector<char>
创建缓冲区时,缓冲区的大小是向量的大小。
如果你没有给它一个大小,它将是一个零长度的缓冲区。
如果缓冲区中至少有N个字节或缓冲区已满,则transfer_at_least
仿函数返回true。在长度为零的缓冲区的情况下,它总是满的,所以它总是返回true。
答案 1 :(得分:2)
与dauphic的答案一致:
你可以像你一样初始化一个char数组:
char data[64]
或者,如果您仍想使用矢量,可以将矢量初始化为特定大小:
std::vector<char> data(64)
or
std::vector<char> data;
data.resize(64);