boost :: asio - Сервер не будет переподключаться к клиенту после его отключения, а затем резервного копирования - PullRequest
0 голосов
/ 01 октября 2018

Если мой клиент сначала работает, а затем запускает сервер, сервер подключится.Но если я выключу сервер (с работающим клиентом) и снова включу сервер, он не будет повторно подключаться к клиенту.Когда Сервер отключается, я отменяю, выключаю и закрываю сокет.Однако, когда сервер снова запускается, метод Connect не запускается снова.У меня нет доступа к коду сервера.Я не уверен, на каком уровне обнаружен этот запрос на подключение.

Фрагменты кода: RadaClient наследует Client ...

Конструктор для RadaClient:

RadaClient::RadaClient(const std::string& aHostIp,
                           const int& aHostPort) :
        mIoServiceWorkPtr(std::unique_ptr<boost::asio::io_service::work>(new boost::asio::io_service::work(mIoService))),
        mIoThreadPtr(std::unique_ptr<boost::thread>(new boost::thread(boost::bind(&boost::asio::io_service::run, &mIoService)))),
Client(aHostIp, aHostPort, mIoService)
{
      std::cout << "host ip " 
                << aHostIp 
                << " host port " 
                << aHostPort << std::endl;
}

class Client
{
public:    
    bool Connect()
    {
        _mConnected = false;
        while (!_mConnected)
        {
            try
            {
                tcp::resolver resolver(_mSocket.get_io_service());
                tcp::resolver::query query(tcp::v4(), _mHost, 
                boost::lexical_cast<std::string> (_mPort));
                tcp::resolver::iterator iterator resolver.resolve(query);
                _mSocket.connect(*iterator);
                _mConnected = true;
            }
            catch (std::exception& e)
            {
                std::cout << "Caught exception \"" << e.what() << "\"\n";
                // printf("connect attempt failed\n");
                _mConnected = false;
            }
        }

        std::cerr << "TCP Client Successfully Connected... " << std::endl;

        _mMessageHandleThreadPtr.reset(new 
        boost::thread(boost::bind(&Client::_MessageHandleThread, this)));
        _mReadMessageThreadPtr.reset(new boost::thread(boost::bind(&Client::_ReadMessageThread, this)));
        return true;
    }

    void Disconnect()
    {
        std::cerr << "TCP Client";
        if (_mConnected)
        {
            _mConnected = false;        
            try
            {
                _mSocket.cancel();
                _mSocket.shutdown(_mSocket.shutdown_both);
                _mSocket.close();
            }
            catch (std::exception& e)
            {
                std::cerr << "Exception Disconnect(): " 
                          << e.what() << "\n";
            }
        }
        std::cerr << " Disconnected" << std::endl;
    }
...