upd*_*liu 4 c++ boost boost-asio c++11
使用yield_context作为堆栈协程中的Asio异步操作的处理程序真棒!但是ip::basic_resolver::async_resolve处理程序的签名不同于简单地接收错误代码(我很好奇为什么不将它resolver::iterator &作为参数async_resolve,如basic_socket<Protocol1, SocketService> &参数中的那样basic_socket_acceptor::async_accept).有没有办法yield用作它的处理程序?
同样的问题也适用于async_connect.
正如Stackful Coroutines概述中所述,当将yield_context处理程序作为处理程序传递给其异步操作的处理程序具有以下形式的启动函数时:
void handler(boost::system::error_code ec, result_type result);
Run Code Online (Sandbox Code Playgroud)
启动功能将返回result_type.在这种情况下,basic_resolver::async_resolve()处理程序类型要求是ResolverHandler,其格式为:
void resolve_handler(
const boost::system::error_code& ec,
boost::asio::ip::tcp::resolver::iterator iterator)
Run Code Online (Sandbox Code Playgroud)
因此,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();
}
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
573 次 |
| 最近记录: |