我正在与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
- &gt;
auto data_reader_thread = std::thread {[this] {
while(run_thread) {
Read_Data_Sync();
}
}};
以下是我如何更改此内容以制作阅读机制async
- &gt;
读者线程保持不变,除了它现在调用另一个我编码的读取函数以async
方式读取数据
auto data_reader_thread = std::thread {[this] {
while(run_thread) {
Read_Data_Async();
}
}};
我做了msg_body
&amp; msg_header
作为我班级的成员变量。更新的逻辑是从线程函数连续调用Read_Data_Async
。 Read_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
永远不会被回调!! 我的工作有什么问题?我查看了很多相关帖子,例如this one试图解决我的问题
问题但是该链接再次建议拨打io.run
,因为其约为boost::asio::async_read_until
而不是boost::asio::async_read
。
我的上述逻辑是否正确boost::asio::async_read
?我应该asio
回调我的处理函数?
答案 0 :(得分:1)
你必须在某处运行io_service::run()
¹
实际上,执行异步IO的整个想法是你 NOT 需要单独的线程进行读/写:完全双工完全可以在一个线程上完成。
使用run_one,poll或poll_one 进行一些更复杂的循环