What does boost::asio::ip::tcp::resolver::iterator do?

12,457

boost::asio::ip::tcp::resolver::iterator iterates through the address list of the host that you specified (hosts can have multiple addresses).

Like an std::string::iterator iterates through its characters, boost::asio::ip::tcp::resolver::iterator iterates through its address list.

The following code:

while (error && endpoint_iterator != end)
{
  socket.close();
  socket.connect(*endpoint_iterator++, error);
}

is attempting to establish a connection to each endpoint until it succeeds or runs out of endpoints (thank you for the correction Eugen Constantin Dinca).

Share:
12,457

Related videos on Youtube

Hami
Author by

Hami

there is nothing 2 lines of python can't solve

Updated on July 24, 2020

Comments

  • Hami
    Hami over 3 years

    I'm starting with boost asio programming in C++ and when looking over the examples I just can't understand what does boost::asio::ip::tcp::resolver::iterator do.

    Code:

    boost::asio::io_service io_service;
    
    tcp::resolver resolver(io_service);
    tcp::resolver::query query(argv[1]);
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    tcp::resolver::iterator end;
    
    tcp::socket socket(io_service);
    boost::system::error_code error = boost::asio::error::host_not_found;
    while (error && endpoint_iterator != end)
    {
      socket.close();
      socket.connect(*endpoint_iterator++, error);
    }
    

    Please help me and excuse me if my question doesn't provide enough information.

    • Inverse
      Inverse over 12 years
      Gotta love the boost.asio namespaces. barf
  • Eugen Constantin Dinca
    Eugen Constantin Dinca over 12 years
    Actually the while tries to connect to each endpoint until it succeeds or it runs out of endpoints. So at most 1 endpoint will be connected at the end of the loop.
  • Hami
    Hami over 12 years
    Why does it use *endpoint_iterator++ instead of endpoint_iterator++? Why would you need pointers?
  • Sam Miller
    Sam Miller over 12 years
    @Hami ip::tcp::resolver::iterator is not a pointer, it just looks and behaves like one. The postfix increment operator (operator++(int)) gets the next iterator after the indirection operator (operator*()) obtains the underlying endpoint and returns it to socket::connect(). If the connection fails, error is set and the loop continues. These are the same concepts used by iterators in the Standard Template Library.
  • pooya13
    pooya13 almost 5 years
    To clarify @SamMiller 's comment, the increment operator is applied before the indirection operator (due to operator precedence rules), but it is returning the original iterator to the indirection operator due to the fact that ++ is a postfix operator.
  • Srijan Chaudhary
    Srijan Chaudhary over 3 years
    iterator is deprecated in the laster version of boost, is there an alternative to this?
  • Ernie Sanderson
    Ernie Sanderson almost 2 years
    @SrijanChaudhary You can use the following function auto const results = resolver.resolve(host, port);

Related