2011-01-13 8 views
0

Ich versuche asynchron einen FTP-Host mit Boost.Asio auflösen.Async Resolve mit Boost.Asio

Hier ist, was ich bisher ausprobiert habe:

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

Aber aus irgendeinem Grund, wenn ich es ausführen, es druckt einfach nichts:

[email protected]:~/Desktop$ g++ -o test -lboost_system test.cc 
[email protected]:~/Desktop$ ./test 
[email protected]:~/Desktop$ 

keine Fehler oder Warnungen an die Zusammenstellung aber.

Wie kann ich das beheben?

Antwort

5

Sie müssen io_service.run() anrufen, um tatsächlich die Arbeit zu tun. Denken Sie an die async_resolve als eine Anfrage in einer Anfrage-Warteschlange - Sie brauchen etwas (die io_service), um die Anfragen in der Warteschlange zu verarbeiten, und dazu müssen Sie tatsächlich run() es! In diesem Fall wird eine Anforderung angezeigt, ausgeführt, der Handler aufgerufen und dann beendet.

+0

Danke! Führt 'io_service.run()' das im aktuellen Thread aus? Wenn ja, gibt es eine Möglichkeit, dies nicht zu blockieren? –

+1

Ja, Sie müssen einen 'boost :: thread' erstellen und dann' '' an '' run'' der 'io_service' Instanz binden. – Nim

2

Ihr Objekt io_service und ip::tcp::resolver gehen aus dem Geltungsbereich aus. Verschieben Sie beide in Mitglieder der Klasse FtpSession und rufen Sie dann innerhalb von main nach session.Connect(host)io_service::run auf, um die Ereignisschleife zu starten.

Ich antwortete eine similar question vor ein paar Tagen, die Ihnen auch helfen kann.