2

我按照 Boost.Asio 教程实现了一个简单的 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, a socket, aresolver和一个解析器query对象,然后调用resolver_.async_resolve()方法,但是 ResolverHandlerclient::handle_resolve几乎从不被调用,有时在应用程序第一次启动时, ResolverHandler 可能会被调用一两次,但仅此而已。

我阅读了官方文档,但一无所获。有什么建议吗?

4

2 回答 2

3

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

于 2013-02-17T18:49:22.767 回答
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 方法之后,地址会被异步解析。

于 2013-02-16T14:36:19.847 回答