如何连接/断开服务器?

时间:2010-05-16 21:38:55

标签: c++ boost boost-asio

我正在使用最新版本的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 个答案:

答案 0 :(得分:1)

通常,在您拨打io_service::run电话后,通常很少有理由致电io_service::stopio_service::reset

在上面的代码中,connect方法而不是将主动建立连接 - tcp::resolver::resolve只是转动查询(例如主机名或IP地址)等)进入可用于连接套接字的TCP端点。您通常需要取消引用由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方法应该采用什么,这完全取决于应用程序。但通常您需要通过封装socket对象来跟踪活动连接,当您调用disconnect时,可以根据需要关闭该对象。有关此示例,请在此处查看标题为“白天3 - 异步TCP日间服务器”的教程:http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/tutorial/tutdaytime3.html