Async Resolve с boost.asio
-
10-10-2019 - |
Вопрос
Я пытаюсь асинхронно Установите хост FTP с помощью boost.asio.
Вот что я пробовал до сих пор:
#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;
}
Но по какой -то причине, когда я его выполняю, это просто ничего не печатает:
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$
Нет ошибок или предупреждений в сборнике, хотя.
Как я могу это исправить?
Решение
Вам нужно позвонить io_service.run()
чтобы действительно выполнить работу. Подумайте о async_resolve
в качестве запроса в очереди запроса - вам что -то нужно ( io_service
) для обработки запросов в очереди, и для этого вам действительно нужно run()
Это! В этом случае он увидит один запрос, выполните его, вызовите обработчик, а затем выйдет.
Другие советы
Ваш io_service
а также ip::tcp::resolver
Объект выходит из области. Перемещать их обоих в членов FtpSession
класс, затем призвать io_service::run
внутри главного после session.Connect(host)
Чтобы начать петлю события.
Я ответил Подобный вопрос Несколько дней назад это может помочь вам.