2011-02-24 11 views
14

Estoy comenzando con la programación de boost asio en C++ y cuando miro los ejemplos simplemente no puedo entender qué hace boost::asio::ip::tcp::resolver::iterator.¿Qué impulsa :: asio :: ip :: tcp :: resolver :: iterator do?

Código:

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); 
} 

Por favor, ayudar a mí y me disculpe si mi pregunta no proporciona suficiente información.

+2

Me encantan los espacios de nombres boost.asio. * barf * – Inverse

+0

FYI: la consulta es sólo para un servicio. Si está buscando un host específico para un servicio, necesita agregar otro parámetro al tcp :: resolver :: query ctor. –

Respuesta

19

boost::asio::ip::tcp::resolver::iterator itera a través de la lista de direcciones del host que especificó (los hosts pueden tener varias direcciones).

Como un std :: string :: iterator itera a través de sus caracteres, boost :: asio :: ip :: tcp :: resolver :: iterator itera a través de su lista de direcciones.

El siguiente código:

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

está intentando establecer una conexión con cada punto final hasta que lo consiga o se queda sin puntos finales (gracias por la corrección Eugen Dinca Constantin).

+2

En realidad, el 'while' intenta conectarse a cada punto final hasta que tenga éxito o se quede sin puntos finales. Entonces, como máximo 1 punto final se conectará al final del ciclo. –

+0

¿Por qué usa * endpoint_iterator ++ en lugar de endpoint_iterator ++? ¿Por qué necesitarías punteros? – Hami

+5

@Hami 'ip :: tcp :: resolver :: iterator' no es un puntero, simplemente se ve y se comporta como uno. El operador de incremento postfix ('operator ++ (int)') obtiene el siguiente iterador ** después de ** el operador de indirección ('operator *()') obtiene el 'endpoint' subyacente y lo devuelve a' socket :: connect() ' . Si la conexión falla, se establece 'error' y el ciclo continúa. Estos son los mismos conceptos utilizados por los iteradores en la Biblioteca de plantillas estándar. –

Cuestiones relacionadas