boost.asio boost :: asio :: ip :: tcp :: resolver :: async_resolve不起作用

问题描述:

我遵循Boost.Asio toturial来实现一个简单的TCP客户端,但是我在第一步被阻止, boost::asio::ip::tcp::resolver::async_resolve不起作用,所述ResolverHandler不会被调用:boost.asio boost :: asio :: ip :: tcp :: resolver :: async_resolve不起作用

void client::start() 
    { 
     socket_.reset(new boost::asio::ip::tcp::socket(io_service_)); 
     // Start an asynchronous resolve to translate the server and service names 
     // into a list of endpoints. 
     tcp::resolver::query query(server_address_, server_port_); 
     resolver_.async_resolve(query, 
      boost::bind(&client::handle_resolve, 
      shared_from_this(), 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::iterator)); 
    } 

如上所示的源代码,创建一个io_service,一个socket,一个resolver和解析器query对象,然后调用resolver_.async_resolve()方法,但ResolverHandler client::handle_resolve几乎永远不会被调用,有时在第一次启动应用程序时,ResolverHandler可能会被调用一次或两次,但没有更多。

我看了官方文档,但什么都没发现。任何建议?

+0

server_address_&server_port_应该可用,例如“localhost”和“25166”。 – 2013-02-16 09:34:29

+0

我想你的'tcp :: resolver :: query'在函数退出时被销毁。 – PSIAlt 2013-02-16 10:26:56

+0

@PSIAlt''async_resolve()'[copies](http://stackoverflow.com/a/12802484/283302)'tcp :: resolver :: query'对象 – 2013-02-16 15:12:34

如果完成处理程序没有被调用 - 很可能你不会正确运行io_service:例如,其run循环可能会被其他一些未返回的处理程序阻止,或者由于缺少工作而可能退出等。

这个工作对我来说:

void SSLSocket::Connect(SSLSocket* psSLS, const string& serverPath, const string& port) 
{ 
    boost::shared_ptr<boost::asio::io_service> IOServ(new boost::asio::io_service); 
    // Create the resolver and query objects to resolve host name in serverPath to an ip address. 
    IOService = IOServ; // IOService defined as a class member in the .h file. 
    boost::asio::ip::tcp::resolver resolver(*IOService); 
    boost::asio::ip::tcp::resolver::query query(serverPath, port); 
    ... 
} 

上面的代码使用同步方法.VS。您的代码正在使用的异步方法。如果要继续异步执行此操作,请将io_service对象和查询对象设置为一个类变量。也意识到async_resolve方法会立即返回而不做任何事情。在调用handle_resolve方法之后,地址将异步解析。

+0

传递''tcp :: resolver :: query'自动存储持续时间到'async_resolve()'是[只要很好](http://stackoverflow.com/a/12802484/283302),底层服务将复制对象有必要的。 – 2013-02-16 15:13:28