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

时间:2011-10-15 17:38:41

标签: c++ networking boost boost-asio

我正在尝试使用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而遗漏了什么?我仍然不确定它是如何工作的。

1 个答案:

答案 0 :(得分:5)

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

详细了解boost::asio::service::run ()。我建议您查看documentation,包括教程,示例和参考。值得深入了解这个概念。

希望它有所帮助!

P.S。:在旁注中,您的代码不是异常安全的。请注意,如果类的构造函数因异常而失败,则永远不会调用该类实例的析构函数。因此,如果其类型不是“智能指针”之一,则可能至少泄漏m_pSocket。您应该考虑使其异常安全,将代码移动到应该由用户调用的另一个方法,或者甚至使用自由函数包装此功能。