2011-01-13 3 views
0

비동기 적으로은 Boost.Asio를 사용하여 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; 
} 

을하지만 어떤 이유로, 나는 그것을 실행하면, 그냥 아무것도 인쇄되지 않습니다 :에

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

오류 또는 경고를 여기

는 지금까지 시도했습니다 무엇 비록 편집.

어떻게 해결할 수 있습니까?

답변

5

실제로 작업 메타 링크를 수행하려면 io_service.run()으로 전화해야합니다. 요청 대기열에서 요청으로 async_resolve을 생각해보십시오. 대기열에서 요청을 처리하려면 무언가 (io_service)가 필요하며이를 수행하려면 실제로 run()이 필요합니다. 이 경우 하나의 요청을보고 실행하고 처리기를 호출 한 다음 종료합니다.

+0

감사합니다. 'io_service.run()'이 현재 스레드에서 이것을 실행합니까? 그렇다면 비 차단을 수행 할 수있는 방법이 있습니까? –

+1

예, 당신은'boost :: thread'를 생성 한 다음'io_service' 인스턴스의'run'에'bind'를 생성해야합니다. – Nim

2

io_serviceip::tcp::resolver 개체가 범위를 벗어납니다. 두 파일 모두 FtpSession 클래스의 구성원으로 이동 한 다음 session.Connect(host) 뒤에 메인 내부에 io_service::run을 호출하여 이벤트 루프를 시작하십시오.

나는 수 회 전에 similar question에 답변했기 때문에 도움이 될 것입니다.