我正在尝试使用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而遗漏了什么?我仍然不确定它是如何工作的。
答案 0 :(得分:5)
boost::asio::service::run ()
是一个阻止通话。现在,在您的示例中,它可能会或可能不会立即返回。如果它没有,你甚至在创建套接字之前就被阻止了,并且从不调用read,所以不能指望回调。否则,退出调度循环,因此不会传递任何回调。
详细了解boost::asio::service::run ()
。我建议您查看documentation,包括教程,示例和参考。值得深入了解这个概念。
希望它有所帮助!
P.S。:在旁注中,您的代码不是异常安全的。请注意,如果类的构造函数因异常而失败,则永远不会调用该类实例的析构函数。因此,如果其类型不是“智能指针”之一,则可能至少泄漏m_pSocket
。您应该考虑使其异常安全,将代码移动到应该由用户调用的另一个方法,或者甚至使用自由函数包装此功能。