C++ ASIO中的串co_等待功能

C++ ASIO中的串co_等待功能,c++,boost-asio,c++-coroutine,C++,Boost Asio,C++ Coroutine,我试图设计一个类,它提供一个Connect()函数来连接端点 #如果NDEF端点#水电站 #定义端点_水电站 #包括 命名空间Utils{ 类端点{ 公众: 使用ResolveResult=asio::ip::basic\u解析器\u结果; Endpoint()=默认值; 端点(常量std::字符串和主机名,常量std::字符串和端口); asio::等待解决(); asio::等待连接(); 常量std::字符串和主机名(); 常量std::字符串和端口(); asio::ip::tcp::套

我试图设计一个类,它提供一个Connect()函数来连接端点

#如果NDEF端点#水电站
#定义端点_水电站
#包括
命名空间Utils{
类端点{
公众:
使用ResolveResult=asio::ip::basic\u解析器\u结果;
Endpoint()=默认值;
端点(常量std::字符串和主机名,常量std::字符串和端口);
asio::等待解决();
asio::等待连接();
常量std::字符串和主机名();
常量std::字符串和端口();
asio::ip::tcp::套接字和套接字();
std::string ToString();
私人:
std::唯一的ptr插座;
std::字符串主机名;
std::字符串端口;
};
}//命名空间Utils
#恩迪夫
以及端点的定义

#包括“Utils/Endpoint.hpp”
#包括
#包括
#包括
#包括
命名空间Utils{
使用asio::waitiable;
使用asio::使用可等待的;
使用asio::ip::tcp;
使用ResolveResult=Endpoint::ResolveResult;
端点::端点(常量std::字符串和主机名,常量std::字符串和端口)
:主机名(主机名),端口(端口){}
可等待的端点::Resolve(){
试一试{
跟踪(“解析{}:{}”,主机名,端口);
const asio::executor&executor=co_wait asio::this_coro::executor;
tcp::解析器解析器(执行器);
ResolveResult端点=
co_wait resolver.async_resolve({hostname,port},use_waitable);
跟踪(“解析{}:{}成功”,主机名,端口);
co_返回端点;
}捕获(标准::异常&e){
spdlog::错误(“解析{}:{}失败。异常:{}”),主机名,端口,
e、 什么());
抛出std::runtime_错误(例如what());
}
}
可等待的端点::Connect(){
试一试{
跟踪(“连接到{}:{}”,主机名,端口);
if(socket.get()){
跟踪(“{}:{}已连接”,主机名,端口);
co_返回;
}
const asio::executor&executor=co_wait asio::this_coro::executor;
套接字=标准::使_唯一(执行器);
ResolveResult端点=co_wait Resolve();
自动串=asio::生成串(执行器);
co_wait asio::async_connect(*套接字,端点,使用_waitable);
跟踪(“连接到{}:{}成功,套接字状态:{}”,主机名,端口,
socket->is_open());
}捕获(标准::异常&e){
spdlog::错误(“连接到{}:{}失败。异常:{}”),主机名,端口,
e、 什么());
抛出std::runtime_错误(例如what());
}
}
const std::string&Endpoint::Hostname(){return Hostname;}
const std::string&Endpoint::Port(){return Port;}
tcp::socket&端点::socket(){return*socket;}
std::string端点::ToString(){
返回fmt::format(“{}:{}”,主机名,端口);
}
}//命名空间Utils
如果我为端点的一个实例生成两个协程,并同时调用Connect function()。它不能正常工作。一种情况是,一个协同程序在

socket=std::使_唯一(执行器);
而另一个则会进入连接的分支,在解析完成之前已连接

我的测试代码

#包括“Utils/Endpoint.hpp”
#包括
#包括
#包括
使用asio::co_spawn;
使用asio::分离;
使用asio::ip::tcp;
asio::等待端点测试(Utils::端点和端点){
const auto&executor=co_wait asio::this_coro::executor;
co_等待端点。Connect();
tcp::socket&socket=endpoint.socket();
co_等待asio::异步_写入(套接字,
asio::buffer(std::string(“Hello World”,10000)),
asio::使用(可等待);
}
测试(UTIL,端点){
asio::io_上下文ctx;
Utils::Endpoint=Utils::Endpoint(“baidu.com”、“80”);
产卵(
ctx,[&]{返回端点测试(端点);},已分离);
产卵(
ctx,[&]{返回端点测试(端点);},已分离);
ctx.run();
}
以及输出:

[2020-04-17 10:14:20.952] [trace] Connecting to baidu.com:80
[2020-04-17 10:14:20.953] [trace] Resolving baidu.com:80
[2020-04-17 10:14:20.953] [trace] Connecting to baidu.com:80
[2020-04-17 10:14:20.953] [trace] baidu.com:80 has been connected
[2020-04-17 10:14:22.403] [trace] Resolve baidu.com:80 success
[2020-04-17 10:14:22.478] [trace] Connect to baidu.com:80 success, socket status: true

因此,我想对Connect()函数进行串接,直到前一个Connect()函数完成后,该函数才会执行。或者任何其他可以实现此目的的工具。

您最终解决了吗?也许改变第三个参数会有所帮助。或者,您是否最终得到了类似于co_在分离模式下为co_wait(auto&call:callables)生成一个等待循环的结果?