【发布时间】:2022-01-20 02:32:21
【问题描述】:
我正在尝试编写一个函数 async_read_string_n 以从具有 Boost.Asio 1.78(和 GCC 11.2)的套接字中异步读取正好为 n 字节的字符串。
这就是我想要使用函数async_read_string_n的方式:
void run() {
co_spawn (io_context_, [&]() -> awaitable<void> {
auto executor = io_context_.get_executor();
tcp::acceptor acceptor(executor, listen_endpoint_);
auto [ec, socket] = co_await acceptor.async_accept(as_tuple(use_awaitable));
co_spawn(executor, [&]() -> awaitable<void> {
auto [ec, header] = co_await async_read_string_n(socket, 6, as_tuple(use_awaitable));
std::cerr << "received string " << header << "\n";
co_return;
}
, detached);
co_return;
}
, detached);
}
这是我按照中的建议写async_read_string_n的尝试
- https://www.boost.org/doc/libs/1_78_0/doc/html/boost_asio/reference/asynchronous_operations.html#boost_asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type
- https://www.boost.org/doc/libs/1_78_0/doc/html/boost_asio/overview/core/cpp20_coroutines.html#boost_asio.overview.core.cpp20_coroutines.error_handling
(我不关心内存复制。这不应该很快;它应该有一个不错的 API。)
template<class CompletionToken> auto async_read_string_n(tcp::socket& socket, int n, CompletionToken&& token) {
async_completion<CompletionToken, void(boost::system::error_code, std::string)> init(token);
asio::streambuf b;
asio::streambuf::mutable_buffers_type bufs = b.prepare(n);
auto [ec, bytes_transferred] = co_await asio::async_read(socket, bufs, asio::transfer_exactly(n), as_tuple(use_awaitable));
b.commit(n);
std::istream is(&b);
std::string s;
is >> s;
b.consume(n);
init.completion_handler(ec, s);
return init.result.get();
}
编辑
(我有一个语法错误,我已修复它。)这是async_read_string_n 中的编译器错误,我一直坚持:
GCC 错误:
错误:'co_await' 不能在具有推导返回类型的函数中使用
函数async_read_string_n怎么写?
【问题讨论】:
标签: c++ boost-asio c++20 asio c++-coroutine