Resolver asíncrono con Boost.Asio
-
10-10-2019 - |
Pregunta
Estoy tratando de asíncrona resolver un servidor FTP usando Boost.Asio.
Esto es lo que he probado hasta ahora:
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
using boost::asio::ip::tcp;
class FtpSession {
public:
void Connect(std::string& host) {
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(host, "ftp");
resolver.async_resolve(query,
boost::bind(&FtpSession::OnResolve, this,
boost::asio::placeholders::error,
boost::asio::placeholders::iterator));
}
private:
void OnResolve(const boost::system::error_code& err, tcp::resolver::iterator endpoint_iterator) {
if (!err)
{
std::cout << "resolved!";
}
else
{
std::cout << "error.";
}
}
};
int main() {
FtpSession session;
std::string host("ftp.remotesensing.org");
session.Connect(host);
return 0;
}
Sin embargo, por alguna razón, cuando yo haga él, simplemente no se imprime nada:
alon@alon-GA-73PVM-S2H:~/Desktop$ g++ -o test -lboost_system test.cc
alon@alon-GA-73PVM-S2H:~/Desktop$ ./test
alon@alon-GA-73PVM-S2H:~/Desktop$
No hay errores o advertencias en la compilación sin embargo.
¿Cómo puedo solucionar este problema?
Solución
Debe io_service.run()
llamada a hacer realidad los me parece trabajo. Piensa en la async_resolve
como una solicitud en una cola de peticiones - que necesita algo (el io_service
) para procesar las peticiones en la cola, y para hacer eso, usted necesita realmente run()
él! En este caso, se verá una petición, ejecutarlo, llamar al manejador y luego salir.
Otros consejos
Su io_service
y el objeto ip::tcp::resolver
se va fuera de alcance. Mover a ambos en los miembros de la clase FtpSession
y luego invoque el interior de io_service::run
principal después session.Connect(host)
para iniciar el ciclo de eventos.
Me respondió una pregunta similar hace unos días que pueden ayudar también .