我正在使用最新版本的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()
吗?
答案 0 :(得分:1)
通常,在您拨打io_service::run
电话后,通常很少有理由致电io_service::stop
或io_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