【发布时间】:2017-04-03 19:36:20
【问题描述】:
是的。我知道在boost::asio 中有一些关于这个time_out 的问题。我的问题可能太简单了,asio 的人在这里无法解决。
我在 TCP 协议上使用boost::asio 以尽可能快地循环连续读取网络上的数据。
以下函数 ReadData() 在 while 循环中从工作人员 std::thread 连续调用。
std::size_t ReadData(std::vector<unsigned char> & buffer, unsigned int size_to_read) {
boost::system::error_code error_code;
buffer.resize(size_to_read);
// Receive body
std::size_t bytes_read = boost::asio::read(*m_socket, boost::asio::buffer(buffer), error_code);
if (bytes_read == 0) {
// log error
return;
}
return bytes_read;
}
效果很好。返回数据。一切都很好。
我想要的只是为boost::asio::read 使用time_out。我了解到我需要使用 boost::asio::async_read 和 boost::asio::async_wait 才能使 time_out 技术起作用。
一位boost example建议使用boost::asio::async_read_until?
我应该使用boost::asio::async_read 还是boost::asio::async_read_until?
我使用boost::asio::async_read 或boost::asio::async_read_until 或boost::asio::read 都没有关系。但我希望在对我的方法ReadData 的调用中触发并完成asio::read 调用,这样客户端代码就不会受到影响。
我怎样才能做到这一点?请推荐
【问题讨论】:
-
你知道你可以使用
socket::cancel()来取消异步操作,对吧? -
是的。我知道如果达到超时,我应该取消套接字。但是我如何首先在异步读取中使用 time_out 呢?
-
@TheQuantumPhysicist。
socket::cancel()会处理同步读取操作吗? -
@SegmentationFault 同时启动 async_wait 和 async_read。第一个完成应该取消另一个。您需要一个标志来表明您已取消,并且您需要使用一个链来管理线程争用。
-
@TheQuantumPhysicist 已发布答案。建议您查看我在此处使用的每种技术的 asio 文档。 asio 很深,文档也很简洁。
标签: c++ boost-asio asio