0

boost::asio::io_service を使用して非同期 TCP 通信を管理しています。asio バージョンはboost::asio 1.46. サーバーがダウンしたときにクライアントをサーバーに再接続させたい。

コードは次のとおりです。

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が動かない!connect メソッドを直接使用すると、サーバーはソケットを受け取ることができますがio_service、クライアントでは動作しません。

サーバーに再接続する正しい方法を誰か教えてもらえますか? どうもありがとう!

4

1 に答える 1