boost::asio::async_read 不会回调我的处理程序函数
boost::asio::async_read does not callback my handler function
我正在与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_body
和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
永远不会被回调!!我做什么有什么问题?我浏览了很多像这样的相关帖子,试图解决我的 问题,但该链接再次建议调用io.run
,因为它boost::asio::async_read_until
不boost::asio::async_read
。
我的上述逻辑对boost::asio::async_read
是否正确?我应该asio
什么来回调我的处理程序函数?
您必须在某处运行io_service::run()
¹
实际上,执行异步 IO 的整个想法是,您不需要单独的线程进行读取/写入:在单个线程上完全可以进行全双工。
¹ 或一些更复杂的循环,带有run_one、轮询或poll_one
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- C++存储带有可变参数的回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 使用带有闭包的 lambda 的回调
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- 从其存储的回调中删除 std::函数是否安全
- 如何实现从C++函数到 Swift 的回调
- C++ Qt5 中带有 pigpio 库的回调函数
- libevent是否允许在不同的线程中运行timer/io的回调
- v8 源代码中 ArrayMap 函数的回调 fn 参数是什么?
- Poco 计时器,具有来自同一类的回调
- 为什么没有调用我的回调?
- SetWindowsHookEx没有调用我的回调
- 为什么 DNSServiceProcessResult 两次调用我的回调
- libusb_hotplug_register_callback不接受我的回调函数
- (如何)当std::future准备就绪时,我可以获得boost::asio::io_service的回调吗
- ROS:subscribe函数无法识别我的回调方法
- GStreamer似乎没有调用我的回调
- 我可以从OpenGL的显示器调用我的回调函数吗