2013-02-16 92 views
2

我遵循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

回答

3

如果完成處理程序沒有被調用 - 很可能你不會正確運行io_service:例如,其run循環可能會被其他一些未返回的處理程序阻止,或者由於缺少工作而可能退出等。

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方法之後,地址將異步解析。

+0

傳遞''tcp :: resolver :: query'自動存儲持續時間到'async_resolve()'是[只要很好](http://stackoverflow.com/a/12802484/283302),底層服務將複製對象有必要的。 – 2013-02-16 15:13:28

相關問題