提升::asio::async_read 不会在条件下停止
Boost::asio::async_read doesn't stop on condition
我有一些问题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);
相关文章:
- 为什么简单的算术减法在"if"条件下不起作用?
- 在什么条件下使用 std::memcpy 在对象之间复制是安全的?
- 改进简单条件下C++样式
- 唤醒多个线程以在每个条件下工作一次
- "is defined"宏检查及其调用必须处于不同的条件下吗?
- 在if条件下,右或左改变值的相等性检查是否有任何区别
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
- 轮班操作在条件下使用的说明
- 在不同条件下无法访问我的向量变量
- 在某些条件下最大化 GCD
- 如何更改此空隙函数,以便在特殊条件下返回一个生成的字符串
- 在if-Statement条件下与分配有关的错误
- 如何正确使用“ sizeof”操作员在循环的条件下正确使用
- 提升::MSM 检查保护条件下的状态转换
- C++在 IF 条件下递增
- C 在循环条件下忽略
- Bool Vector 2D数组在IF条件下使用
- 现代C++编译器是否能够避免在某些条件下两次调用常量函数
- 算子!() 和运算符 --() 在 if 条件下