C++ ASIO直接从异步解析获取tcp端点

C++ ASIO直接从异步解析获取tcp端点,c++,asynchronous,tcp,boost-asio,C++,Asynchronous,Tcp,Boost Asio,我希望使用ASIO独立库(而不是Boost ASIO),我正在尝试设置一个客户端以连接到特定端口上的服务器 我在示例中看到,不必处理迭代器就可以获得端点 asio::io_service io_service; // Determine the location of the server. tcp::resolver resolver(io_service); tcp::resolver::query query(host_name, port); tcp::endpoint remote_

我希望使用ASIO独立库(而不是Boost ASIO),我正在尝试设置一个客户端以连接到特定端口上的服务器

我在示例中看到,不必处理迭代器就可以获得端点

asio::io_service io_service;

// Determine the location of the server.
tcp::resolver resolver(io_service);
tcp::resolver::query query(host_name, port);
tcp::endpoint remote_endpoint = *resolver.resolve(query);
我正在尝试使用resolver async_resolve()成员函数解析查询

这是我目前拥有的代码:

asio::io_service IOService;
asio::ip::tcp::resolver resolver(IOService);
asio::ip::tcp::resolver::query query(ADDRESS, PORT);
resolver.async_resolve(query,
            [this](const tcp::endpoint srvEndpoint, std::error_code error)
            {
                IOService->post(
                    [this, error, srvEndpoint]
                    {
                         handle_resolve_handler(error, srvEndpoint);
                    });
            });
是否有一种方法可以执行porthopper示例中所示的操作,但可以异步执行

哦,但是

tcp::endpoint remote_endpoint = *resolver.resolve(query);
非常处理迭代器!它使用它来解除引用。注意到那个可爱的明星了吗?是接线员

至于你的电话:

resolver.async_resolve(query,
            [this](const tcp::endpoint srvEndpoint, std::error_code error)
            {
                IOService->post(
                    [this, error, srvEndpoint]
                    {
                         handle_resolve_handler(error, srvEndpoint);
                    });
            });
不满足完成处理程序要求的。事实上,尝试使用Boost Asio²编译它会产生大量错误:

main.cpp:12:14:   required from here
/usr/local/include/boost/asio/ip/basic_resolver.hpp:163:5: error: static assertion failed: ResolveHandler type requirements not met
     BOOST_ASIO_RESOLVE_HANDLER_CHECK(
     ^
/usr/local/include/boost/asio/ip/basic_resolver.hpp:163:5: error: no match for call to '(Demo::doResolve()::<lambda(boost::asio::ip::tcp::endpoint, boost::system::error_code)>) (const boost::system::error_code&, const boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>&)'
     BOOST_ASIO_RESOLVE_HANDLER_CHECK(

imk cf.使用协同程序(
yield
yield[ec]
)时的区别,
asio::使用未来
等:

²基本上
s/boost::system::error\u code/std::error\u code/

在具有网络接入的系统上

#include <boost/asio.hpp>
#include <iostream>

namespace asio = boost::asio;
using boost::system::error_code;
using asio::ip::tcp;

struct Demo {
    Demo(asio::io_service& svc) : _svc(svc) {}
    void doResolve() {
        resolver.async_resolve(query, [this](error_code error, tcp::resolver::iterator it) {
                tcp::endpoint ep = error? tcp::endpoint{} : *it;
                _svc.post([this, error, ep] { handle_resolve_handler(error, ep); });
            });
    }

  private:
    asio::io_service& _svc;
    tcp::resolver resolver     {_svc};
    tcp::resolver::query query {"www.google.com", "https"};

    void handle_resolve_handler(error_code ec, tcp::endpoint srvEndpoint) {
        std::cout << "handle_resolve_handler: " << ec.message() << " " << srvEndpoint << "\n";
    }
};

int main() {
    asio::io_service svc;
    Demo x(svc);
    x.doResolve();

    svc.run();
}
handle_resolve_handler: Success 216.58.213.196:443