2010-05-16 166 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::stopio_service::reset

在上面的代码中,connect方法是要积极地建立连接 - tcp::resolver::resolve仅仅接通一个查询(如主机名或IP地址等)转换成可使用的TCP端点连接一个插座。通常需要对由resolver::resolve返回的迭代器进行解引用,并将其传递给boost::asio::ip::tcp::socket对象的方法(或其中一个异步类型)以连接端点。

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方法应该怎么做,这完全取决于应用程序。但通常情况下,您需要通过封装socket对象来跟踪活动连接,当您拨打disconnect时,可以根据需要关闭该对象。有关此示例,请参阅标题为“白天3 - 异步TCP白天服务器”的教程:http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/tutorial/tutdaytime3.html

相关问题