提升 Asio Peek 和完成条件
Posted
技术标签:
【中文标题】提升 Asio Peek 和完成条件【英文标题】:Boost Asio Peek and Completion Condition 【发布时间】:2011-09-07 16:21:13 【问题描述】:我正在使用 Boost Asio 设置套接字连接。我想在不消费的情况下查看缓冲区中的数据,并且我想使用完成条件来确保我可以在必要时停止阻塞调用。
我可以从basic_stream_socket::receive获得窥视功能:
template<
typename MutableBufferSequence>
std::size_t receive(
const MutableBufferSequence & buffers,
socket_base::message_flags flags,
boost::system::error_code & ec);
其中一个可能的 message_flags 是basic_stream_socket::message_peek。但是,此调用会阻塞,直到至少读取一个字节或发生错误。我可以从read获得完成条件功能:
template<
typename SyncReadStream,
typename MutableBufferSequence,
typename CompletionCondition>
std::size_t read(
SyncReadStream & s,
const MutableBufferSequence & buffers,
CompletionCondition completion_condition,
boost::system::error_code & ec);
我可以提供一个completion_condition 方法来检查调用是否应该在继续之前中止。
我的问题是:有没有办法在同一个方法调用中获取 message_flags 参数和 completion_condition 参数?
【问题讨论】:
为什么不用异步操作,那就不用担心了——不会阻塞调用,有数据时会通知你。 如果需要,我仍然会遇到无法停止挂起操作的问题。如果它同时具有查看和提供完成条件的能力,我可以执行异步操作,但如果我使用异步方法(如 async_receive),我不确定如何在必要时取消操作。 对于给定的套接字,您可以取消未完成的异步操作。 【参考方案1】:我想查看缓冲区中的数据而不消耗它, 我想使用完成条件来确保我可以 必要时停止阻塞调用。
不要这样做。使用异步方法,例如async_read()
和async_write()
。要停止未完成的异步操作,请使用cancel()
。
【讨论】:
以上是关于提升 Asio Peek 和完成条件的主要内容,如果未能解决你的问题,请参考以下文章
Boost::asio::async_read 不会在条件下停止