2010-07-22 74 views
2

我正在學習boost/asio和編寫電子書中的示例程序。當然,沒有工作的 ;)解析函數在boost/asio中不起作用

#include <boost/asio.hpp> 
#include <iostream> 

int main() { 
    boost::asio::io_service io_service; 
    boost::asio::ip::tcp::resolver::query query("www.boost.org", "http"); 
    boost::asio::ip::tcp::resolver::iterator destination = boost::asio::ip::tcp::resolver::resolve(query); // if i have "." before "resolve" as in books example compilers says i need primary-expresion. 
    boost::asio::ip::tcp::endpoint endpoint; 

    while (destination != end) { 
     endpoint = *destination++; 
     std::cout<<endpoint<<std::endl; 
    } 

    boost::asio::ip::tcp::socket socket(io_service); 
    socket.connect(endpoint); 
    return 0; 
} 

編譯器輸出與「::」前「解決」:

/home/martins/C++/boost_asio_client/client.cpp|7|error: cannot call member function 
‘boost::asio::ip::basic_resolver<InternetProtocol, ResolverService>::iterator 
boost::asio::ip::basic_resolver<InternetProtocol, 
ResolverService>::resolve(boost::asio::ip::basic_resolver<InternetProtocol, 
ResolverService>::query&) 
[with InternetProtocol = boost::asio::ip::tcp, ResolverService = 
boost::asio::ip::resolver_service<boost::asio::ip::tcp>, 
boost::asio::ip::basic_resolver<InternetProtocol, ResolverService>::iterator = 
boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>, 
boost::asio::ip::basic_resolver<InternetProtocol, ResolverService>::query = 
boost::asio::ip::basic_resolver_query<boost::asio::ip::tcp>]’ without object| 

誰能告訴我如何正確解析地址嗎?

回答

6

您需要一個resolver對象。你的迭代器比較也是不正確的,你需要比較哨兵值ip::tcp::resolver::iterator()

#include <boost/asio.hpp> 
#include <iostream> 

int main() { 
    boost::asio::io_service io_service; 
    boost::asio::ip::tcp::resolver::query query("www.boost.org", "http"); 
    boost::asio::ip::tcp::resolver resolver(io_service); 
    boost::asio::ip::tcp::resolver::iterator destination = resolver.resolve(query); 
    boost::asio::ip::tcp::endpoint endpoint; 

    while (destination != boost::asio::ip::tcp::resolver::iterator()) { 
    endpoint = *destination++; 
    std::cout<<endpoint<<std::endl; 
    } 

    boost::asio::ip::tcp::socket socket(io_service); 
    socket.connect(endpoint); 
    return 0; 
} 

這裏是一個示例編譯和運行您的代碼。

[email protected] ~> g++ -lboost_system resolve.cc 
[email protected] ~> ./a.out 
129.79.245.252:80 
[email protected] ~> echo $? 
0 
[email protected] ~> 
+0

嘗試使用「g ++ -lboost_system client.ccp」編譯仍有一些未定義的引用,現在它甚至開始討論線程。 難道是我有一些設置錯誤的提升? – kurrata 2010-07-22 15:23:03

+0

發現爲什麼我永遠不能編譯。我需要將「-pthread」添加到鏈接器選項中。 – kurrata 2010-07-23 06:10:40

3

resolve不是一個靜態成員函數,所以你需要創建一個解析器對象,然後調用該對象的成員函數,就像(從內存中去,所以不要抱着我到這個地方的任何地方關閉以完美):

int main() { 
    boost::asio::io_service io_service; // existing 
    boost::asio::ip::tcp::resolver::query query("www.boost.org", "http"); // existing 

    boost::asio::ip::tcp::resolver resolver(io_service); // added 

    // modified to use object defined above: 
    boost::asio::ip::tcp::resolver::iterator destination = resolver.resolve(query); 
+0

我已經做了這些改變,它變得非常糟糕。很多關於未定義參考的編譯錯誤 – kurrata 2010-07-22 15:08:14

+0

@kurrata您可能需要鏈接到-lboost_system,請參閱我的答案。 – 2010-07-22 15:12:12