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).
Related videos on Youtube
Comments
-
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 over 12 yearsGotta love the boost.asio namespaces. barf
-
-
Eugen Constantin Dinca over 12 yearsActually 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 over 12 yearsWhy does it use *endpoint_iterator++ instead of endpoint_iterator++? Why would you need pointers?
-
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 underlyingendpoint
and returns it tosocket::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 almost 5 yearsTo 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 over 3 yearsiterator is deprecated in the laster version of boost, is there an alternative to this?
-
Ernie Sanderson almost 2 years@SrijanChaudhary You can use the following function
auto const results = resolver.resolve(host, port);