在没有回调的情况下提升 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
。
所以它仍然在顶层阻塞。
是否可以在不使用异步回调的情况下使用 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
。
所以它仍然在顶层阻塞。