如何使用yield_context作为resolver.async_resolve的处理程序
How to use yield_context as the handler of resolver.async_resolve?
使用yield_context
作为堆栈协同程序中异步操作的处理程序真是太棒了!但是ip::basic_resolver::async_resolve
的处理程序有一个不同的签名,而不是简单地接收一个错误代码(我很好奇为什么不把resolver::iterator &
作为async_resolve
的参数,就像basic_socket_acceptor::async_accept
中的basic_socket<Protocol1, SocketService> &
参数一样)。是否有办法使用yield
作为它的处理程序?
这个问题同样适用于async_connect
正如stack - ful Coroutines概述中所述,当将yield_context
作为处理程序传递给初始化函数时,其异步操作的处理程序具有如下形式:
void handler(boost::system::error_code ec, result_type result);
初始函数将返回result_type
。在本例中,basic_resolver::async_resolve()
的处理程序类型要求是ResolverHandler,其形式为:
void resolve_handler(
const boost::system::error_code& ec,
boost::asio::ip::tcp::resolver::iterator iterator)
因此,basic_resolver::async_resolve(..., yield_context)
将返回resolver::iterator
。
下面是演示此行为的完整最小示例:
#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
int main()
{
boost::asio::io_service io_service;
boost::asio::spawn(io_service,
[&](boost::asio::yield_context yield)
{
using tcp = boost::asio::ip::tcp;
tcp::resolver resolver(io_service);
// The async_resolve initiating function will return an iterator, as
// a yield_context is being passed as a handler.
tcp::resolver::iterator iterator = resolver.async_resolve(
tcp::resolver::query("www.google.com", "80"), yield);
// Iterator over endpoints.
for(tcp::resolver::iterator end; iterator != end; ++iterator)
{
std::cout << iterator->endpoint().address().to_string() << std::endl;
}
});
io_service.run();
}
输出:74.125.227.209
74.125.227.210
74.125.227.211
74.125.227.212
74.125.227.208
2607:f8b0:4000:80a::1012
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 是否可以在c++中处理字符串流中的各个元素
- 在多个核心中处理一个HTTP请求