boost::asio::async_read 不会回调我的处理程序函数

boost::asio::async_read does not callback my handler function

本文关键字:我的 回调 处理 程序 函数 asio async read boost      更新时间:2023-10-16

我正在与boost::asio合作,以便在客户端和服务器应用程序之间TCP通信,两者都是由我编写的。我最初是使用同步数据读取来编写的,该数据读取正在使用boost::asio::read.sync_read工作正常,除了我无法在读取操作期间执行socket.cancel。这已经成为一个相当大的限制,因此我现在正在尝试转换我的同步读取来执行async_read机制

以下是我的同步读取机制,非常好。我读了2次。首先获取数据包标头,然后获取运行良好的数据包数据 ->

size_t Read_Data_Sync(std::vector<unsigned char> & msg_body) {
//fetch the header
MyMessageHeader msg_header;
boost::system::error_code err_code;
size_t bytes_received = boost::asio::read(socket, boost::asio::buffer(&msg_header, sizeof(msg_header)), err_code);
if (bytes_received <= 0 || err_code)
return 0;
err_code.clear();
msg_body.resize(msg_header.size);
//fetch the body
bytes_received = boost::asio::read(socket, boost::asio::buffer(msg_body), err_code);
if (bytes_received <= 0 || error_code)
return 0;
return bytes_received;
}

上面的函数曾经从客户端的thread连续调用,我称之为读取器线程like so->

auto data_reader_thread = std::thread {[this] {
while(run_thread) {
Read_Data_Sync();
}
}};

以下是我如何更改它以使读取机制async->

读取器线程保持不变,只是它现在调用另一个读取函数,我已经编码该函数以async方式读取数据

auto data_reader_thread = std::thread {[this] {
while(run_thread) {
Read_Data_Async();
}
}};

我已经将msg_bodymsg_header作为类中的成员变量。更新的逻辑是连续从线程函数调用Read_Data_AsyncRead_Data_Async调用boost::asio::async_read绑定 作为回调Handle_Read_Header的地址,回调又再次执行boost::asio::async_read以读取消息正文,传递处理程序回调以接收message_body

void Read_Data_Async() 
{
//firstly read message header
MyMessageHeader msg_header;
boost::asio::async_read(socket, boost::asio::buffer(&msg_header, sizeof(msg_header)), boost::bind(&TCPSession::Handle_Read_Header, this,
                                       boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
void Handle_Read_Header(const boost::system::error_code & error, std::size_t bytes_transferred)
{
//now read the message body
if (!error && bytes_transferred > 0) {
boost::asio::async_read(socket, boost::asio::buffer(msg_body), boost::bind(&TCPSession::Handle_Read_Body, this,
                                           boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
else {
cout << "Error: " << error << "n";
}
}

void Handle_Read_Body(const boost::system::error_code & error, std::size_t bytes_transferred)
{
if (!error && bytes_transferred > 0) {
// msg_body has the data read from socket
}
else if (error != boost::asio::error::eof) {
cout << "Error: " << error << "n";
}
}

我现在面临的问题是回调Handle_Read_Header永远不会被回调!!我做什么有什么问题?我浏览了很多像这样的相关帖子,试图解决我的 问题,但该链接再次建议调用io.run,因为它boost::asio::async_read_untilboost::asio::async_read

我的上述逻辑对boost::asio::async_read是否正确?我应该asio什么来回调我的处理程序函数?

您必须在某处运行io_service::run()¹

实际上,执行异步 IO 的整个想法是,您不需要单独的线程进行读取/写入:在单个线程上完全可以进行全双工。


¹ 或一些更复杂的循环,带有run_one、轮询或poll_one