boost::asio async_read 不接收数据或使用回调
boost::asio async_read doesn't receive data or doesn't use callback
我正在尝试使用 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
。您应该考虑使其异常安全,将代码移动到用户应调用的另一个方法,甚至使用自由函数包装此功能。
相关文章:
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- 将任意数据传递给不接受"void* userarg"的C++回调
- 通过回调提供数据服务
- 如何使用GLUT的回调操作数据
- 带有字符串抛出bad_alloc用户数据的 curl 写入回调
- 对用户数据进行严格的别名和回调
- Lua 使用元数据回调
- ZeroMQ是否有数据到达时的通知/回调事件/消息
- 正在从回调函数检索数据
- 如何设置正确的回调来检索数据
- 数据写入磁盘回调
- boost::asio async_read 不接收数据或使用回调
- 从回调中访问数据
- 使用自定义数据作为函数参数调用lua回调
- 数据成员"查询回调"不能是成员模板
- 在回调中传递数据
- 可视化 如何将私有数据类的成员函数作为 C++ 非托管线程的回调发送?
- c++中实现回调矩阵的数据结构