我跟随Boost.Asio toturial实现了一个简单的TCP客户端,但我在第一步被阻止,boost::asio::ip::tcp::resolver::async_resolve
不起作用,ResolverHandler永远不会被调用:
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 :(得分:3)
如果未调用完成处理程序 - 很可能您没有正确运行io_service
:例如。其run
循环可能会被其他未返回的处理程序阻止,或者由于缺少工作而可能已退出等。
答案 1 :(得分:0)
这对我有用:
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方法。