在没有回调的情况下提升 asio 非阻塞 IO

Boost asio non-blocking IO without callbacks

是否可以在不使用异步回调的情况下使用 Boost 的 asio 进行非阻塞 IO 即相当于 O_NONBLOCK 套接字选项。

我基本上想要这个功能:

template<typename SyncWriteStream,
         typename ConstBufferSequence>
std::size_t write_nonblock(
    SyncWriteStream & s,
    const ConstBufferSequence & buffers);

This function will write as many bytes as it can and return immediately. It may write 0 bytes.

可能吗?

是的,使用non_blocking()方法让socket进入Asio非阻塞模式:

template<typename SyncWriteStream,
         typename ConstBufferSequence>
std::size_t write_nonblock(
    SyncWriteStream & s,
    const ConstBufferSequence & buffers)
{
    s.non_blocking(true);
    boost::system::error_code ec;
    auto bytes = s.send(buffers, 0, ec);
    if (bytes == 0 && !(ec == boost::asio::error::would_block))
        throw boost::system::system_error(ec, "write_nonblock send");
    return bytes;
}

s.non_blocking(true)的方法不行。 如果您检查 send 实现,它使用 socket_ops::sync_send,如果发送失败,它会 poll_write

所以它仍然在顶层阻塞。