【发布时间】:2022-01-05 23:42:04
【问题描述】:
我有一个组合异步操作,它使用非加速 Asio 1.18.1 来解析并连接到主机和服务。
我希望它将它连接到的实际端点传递给完成令牌。现在没有。
#include <iostream>
#include <string_view>
#include "asio.hpp"
template <typename Token, typename Executor>
auto async_connect_to(Executor&& executor, asio::ip::tcp::socket& socket,
asio::ip::tcp::resolver& resolver, std::string_view host,
std::string_view service, Token&& token) {
return asio::async_compose<Token, void()>(
[&](auto& self) {
co_spawn(
executor,
[&]() -> asio::awaitable<void> {
auto results = co_await resolver.async_resolve(host, service, asio::use_awaitable);
auto endpoint = co_await asio::async_connect(socket, results, asio::use_awaitable);
self.complete();
co_return;
},
asio::detached);
},
token, executor);
}
int main(int argc, char* argv[]) {
if (argc != 3) {
std::cerr << "Usage: client <host> <port>\n";
return 1;
}
asio::io_context io_context;
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::resolver resolver(io_context);
async_connect_to(io_context, socket, resolver, argv[1], argv[2],
[](asio::ip::tcp::endpoint endpoint = {}) {
std::cout << "connected to: " << endpoint << "\n";
});
try {
io_context.run();
} catch (std::exception& e) {
std::cerr << "error: " << e.what() << "\n";
return 1;
}
return 0;
}
因为我在做self.complete(),main 中的完成处理程序实际上从未真正获得我们连接的端点,所以它是默认的。
- 如何从这个组合的异步操作中实际返回一个值?
- 如何改进错误处理,以便完成处理程序可以采用签名
(error_code, tcp::endpoint)而不仅仅是(tcp::endpoint),即它的工作方式与内置异步操作相同? (我相信在回答第一个问题后这很简单)
docs 没有提供 async_compose 和协程的示例,也没有从 co_spawn 返回值。
【问题讨论】:
标签: c++ boost-asio c++20 coroutine