2010-05-16 4 views
1

나는 boost와 boost.asio의 최신 버전을 사용하고 있습니다.서버에 연결/연결 해제하는 방법은 무엇입니까?

enum IPVersion 
{ 
    IPv4, 
    IPv6 
}; 

template <IPVersion version = IPv4> 
class Connection 
{ 
private: 
    boost::asio::io_service io_service; 
    boost::asio::ip::tcp::resolver resolver; 
    boost::asio::ip::tcp::resolver::query query; 
    boost::asio::ip::tcp::resolver::iterator iterator; 
public: 
    Connection(std::string host, std::string port); 

    virtual void connect() { iterator = resolver.resolve(query); } // Is this the moment where the client actually connects? 
    virtual void disconnect() { /* what goes in here? */ } 
}; 

내가 io_service::stop()를 호출해야하고 내 Connection::connect() 통화 io_service::reset() 처음에는 쿼리를 해결하기 전에 :
나는이 클래스가?

답변

1

일반적으로 io_service::run으로 전화하면 io_service::stop 또는 io_service::reset으로 전화해야하는 이유가 거의 없습니다. tcp::resolver::resolve 단지 (등 호스트 이름 또는 IP 주소로) 쿼리를 회전 사용할 수있는 TCP 엔드 포인트에 - 위의 코드에서

connect 방법은 하지 적극적으로 연결을 설정하는 것입니다 소켓을 연결합니다. 일반적으로 resolver::resolve에 의해 반환 된 반복자를 참조 해제하고 boost::asio::ip::tcp::socket 오브젝트의 connect 메소드 (또는 비동기식 유형 중 하나)로 전달하여 엔드 포인트를 연결해야합니다.

Asio 자습서는 좋은 예입니다. 첫 번째 동기 TCP 낮 시간 서버 예 : http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/tutorial/tutdaytime1.html을 참조하십시오. 코드가 먼저 실행합니다 :

tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 

는 다음 TCP 엔드 포인트에 질의 객체를 설정하고, 할 :

socket.connect(*endpoint_iterator++, error); 

가 엔드 포인트에 소켓 객체를 연결합니다.

disconnect 메서드에서 수행해야 할 작업은 애플리케이션에 전적으로 달려 있습니다. 하지만 일반적으로 disconnect으로 전화 할 때 필요한 경우 닫을 수있는 socket 개체를 캡슐화하여 활성 연결을 추적해야합니다. 이에 대한 예를 보려면 "Daytime 3 - 비동기 TCP 데이 타임 서버"라는 자습서를보십시오. http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/tutorial/tutdaytime3.html

관련 문제