boost::asio async_read 不接收数据或使用回调

boost::asio async_read doesn't receive data or doesn't use callback

本文关键字:数据 回调 async asio read boost      更新时间:2023-10-16

我正在尝试使用 boost asio 的 async_read() 免费函数从服务器应用程序接收数据,但我在接收时设置的回调从未被调用。

客户端代码如下所示:

Client::Client()
{
  m_oIoService.run(); // member boost::asio::io_service
  m_pSocket = new boost::asio::ip::tcp::socket(m_oIoService);
  // Connection to the server
  [...]
  // First read
  boost::asio::async_read(*m_pSocket,
                          boost::asio::buffer((void*)&m_oData, sizeof(m_oData)),
                          boost::bind(&Client::handleReceivedData, this,
                                      boost::asio::placeholders::error,
                                      boost::asio::placeholders::bytes_transferred));
}

我尝试使用小数据(短字符串(,但无法使其工作。当我使用同步读取函数(boost::asio::read()(使用两个相同的第一个参数时,一切都很完美。

我在使用io_service时遗漏了什么吗?我仍然不确定它是如何工作的。

boost::asio::service::run ()是一个阻塞调用。现在,在您的示例中,它可能会也可能不会立即返回。如果没有,您甚至在创建套接字之前就被阻止了,并且从不调用 read,因此不能期望回调。否则,调度循环将退出,因此不会传递任何回调。

阅读更多关于 boost::asio::service::run () .我建议您查看文档,包括教程,示例和参考。值得全面了解这个概念。

希望对您有所帮助!

PS:附带说明一下,您的代码不是异常安全的。请注意,如果类的构造函数失败并出现异常,则永远不会调用该类实例的析构函数。因此,如果其类型不是"智能指针"之一,则至少可能会泄漏m_pSocket。您应该考虑使其异常安全,将代码移动到用户应调用的另一个方法,甚至使用自由函数包装此功能。