这是我的代码:
void do_read_header()
{
std::string incoming_header;
boost::asio::async_read(socket_, boost::asio::buffer(incoming_header, incoming_header.length()), [this, incoming_header](boost::system::error_code ec, std::size_t)
{
if (!ec && check_message(incoming_header))
{
do_read_body();
}
//else
//{
// socket_.close();
//}
});
}
void do_read_body()
{
std::string incoming_message;
boost::asio::async_read(socket_, boost::asio::buffer(incoming_message, incoming_message.length()), [this, incoming_message](boost::system::error_code ec, std::size_t)
{
if (!ec)
{
std::cout.write(incoming_message.c_str(), incoming_message.length());
std::cout << "\n";
//do_read_header();
//}
//else
//{
socket_.close();
}
});
}
这是此版本的修改版本:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/chat/chat_client.cpp
我的代码出了什么问题?
答案 0 :(得分:0)
一个问题是incoming_header
和incoming_message
是局部变量,在完成处理程序之前被销毁。你正在捕捉它们的副本,而它们仍然是空的;然后该操作将写入释放的内存,造成无法形容的破坏。
如果您只需要一次读取一条消息,则一个选项是使用成员变量而不是局部变量,并且仅捕获this
。或者,您可以动态分配缓冲区,记住在处理程序中删除它。
在任何情况下,请确保事先调整缓冲区大小,或者使用boost::asio::streambuf
读取任意数量。您正在使用零大小初始化缓冲区,因此即使您没有销毁缓冲区,也不会获得任何数据。