функция разрешения не работает в boost / asio - PullRequest
2 голосов
/ 22 июля 2010

Я изучаю надбавку / 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;
}

вывод компилятора с "::" перед "resol":

/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|

Может кто-нибудь сказать, как правильно разрешить адрес?

Ответы [ 2 ]

6 голосов
/ 22 июля 2010

вам нужен 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;
}

, вот пример компиляции и запуска вашего кода.

samm@macmini ~> g++ -lboost_system resolve.cc
samm@macmini ~> ./a.out 
129.79.245.252:80
samm@macmini ~> echo $?
0
samm@macmini ~>
3 голосов
/ 22 июля 2010

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...