2010-05-16 7 views
1

J'utilise la dernière version de boost et boost.asio.
J'ai cette classe:Comment se connecter/se déconnecter d'un serveur?

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? */ } 
}; 

Dois-je appeler io_service::stop() puis sur mon Connection::connect() appel io_service::reset() d'abord avant de résoudre la requête?

Répondre

1

Généralement, une fois que vous avez appelé io_service::run, il y a souvent peu de raisons d'appeler io_service::stop ou io_service::reset.

Dans votre code ci-dessus, la méthode connect est pas va établir activement une connexion - tcp::resolver::resolve tourne simplement une requête (comme un nom d'hôte ou une adresse IP, etc.) dans un point de terminaison TCP qui peut être utilisé pour connecter une socket. Vous devez généralement déréférencer un itérateur renvoyé par resolver::resolve et le transmettre à la méthode connect de l'objet (ou l'une des variétés asynchrones) pour connecter un point de terminaison.

Les tutoriels Asio en sont un bon exemple. Voir le premier exemple de serveur de jour TCP synchrone ici: http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/tutorial/tutdaytime1.html. Notez que le code passe d'abord:

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

pour transformer un objet de requête dans un point de terminaison TCP, puis:

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

pour connecter un objet socket sur ce point de terminaison. En ce qui concerne ce qui devrait aller dans votre méthode disconnect, cela dépend entièrement de l'application. Mais généralement, vous devez suivre une connexion active en encapsulant un objet socket, que vous pouvez fermer si nécessaire lorsque vous appelez le disconnect. Pour un exemple de ceci, jetez un oeil au tutoriel intitulé "Daytime 3 - Un serveur de jour asynchrone TCP" ici: http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/tutorial/tutdaytime3.html

Questions connexes