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可能会被调用一次或两次,但没有更多。
我看了官方文档,但什么都没发现。任何建议?
如果完成处理程序没有被调用 - 很可能你不会正确运行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方法之后,地址将异步解析。
传递''tcp :: resolver :: query'自动存储持续时间到'async_resolve()'是[只要很好](http://stackoverflow.com/a/12802484/283302),底层服务将复制对象有必要的。 – 2013-02-16 15:13:28
server_address_&server_port_应该可用,例如“localhost”和“25166”。 – 2013-02-16 09:34:29
我想你的'tcp :: resolver :: query'在函数退出时被销毁。 – PSIAlt 2013-02-16 10:26:56
@PSIAlt''async_resolve()'[copies](http://stackoverflow.com/a/12802484/283302)'tcp :: resolver :: query'对象 – 2013-02-16 15:12:34