提升 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 异步等待条件变量

Boost::asio::async_read 不会在条件下停止

boost::asio::async_read_until 与自定义匹配条件运算符重载混淆

提升asio和shared_ptrs的扩散

提升 asio async_resolve 对象生命周期

提升 Asio 和 OpenSSL 1.1.0