2013-06-26 153 views
0

我正在使用boost :: asio :: io_service来管理一些异步TCP通信。 asio版本是boost::asio 1.46。当服务器关闭时,我想让客户端重新连接到服务器。无法重新连接升压asio套接字客户端

代码如下:

tot_client::tot_client(boost::asio::io_service& io_service, 
        tcp::resolver::iterator endpoint_iterator) 
: io_service_(io_service), 
socket_(io_service) 
{ 
    boost::shared_ptr<tcp::socket> ptr_temp(new tcp::socket(io_service)); 
    socket_ptr =ptr_temp; 
    socket_ptr->async_connect(tcp::endpoint(boost::asio::ip::address_v4::loopback(),2012), 
           boost::bind(&tot_client::handle_connect, this, 
              boost::asio::placeholders::error)); 


    } 

如果服务器宕机,我的客户会检查插座是开放的。如果套接字未打开,它,然后尝试重新连接到服务器:

if(socket_ptr.use_count()&&socket_ptr->is_open()) 

{ 
    //... 
} else 
{ 
    reconnect(); 
} 

重新连接代码是在这里:

void tot_client::reconnect() 
{ 
    try 
    { 
     std::cout<<" socket_ptr.reset(new tcp::socket(io_service_)); "<<endl; 
     socket_ptr.reset(new tcp::socket(io_service_)); 
     //socket_ptr->connect(tcp::endpoint(boost::asio::ip::address_v4::loopback(),2012)); 
     socket_ptr->async_connect(tcp::endpoint(boost::asio::ip::address_v4::loopback(),2012), 
           boost::bind(&tot_client::handle_connect, this, 
              boost::asio::placeholders::error)); 
    } 
    catch (std::exception& e) 
    { 
     std::cerr<<e.what()<<endl; 
    } 

} 

插座async_connect不起作用!如果我直接使用连接方法,服务器可以接收套接字,但客户端中的io_service无法正常工作。

有人可以告诉我正确的方式来重新连接到服务器?非常感谢!

回答

0

你确定io_service仍在运行吗?

如果io_service对象停止工作后跑出的工作,你需要调用

io_service.reset(); 
io_service.run(); 
+0

我不知道io_service对象仍在运行, – xuhao

+0

我打电话io_service.reset(); io_service.run(); – xuhao

+0

但它仍然无法正常工作。谢谢你的回复! – xuhao