Как предотвратить изменение порта при сбое соединения - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть клиентское приложение, написанное с использованием boost :: asio.Я пытаюсь реализовать автоматическое переподключение при потере соединения.Когда соединение не может быть установлено (например, когда сервер недоступен) или проблемы с соединением, я пытаюсь установить соединение снова.Однако при каждой попытке приложение открывает новый клиентский порт.Это приводит к постепенному использованию всех динамических портов системы.

class client
{
public:
    client()
        : socket_(nullptr)
        , service_()
    {
        tcp::resolver r(service_);
        auto iterator = r.resolve(tcp::resolver::query("127.0.0.1", "4572"));
        if (iterator == tcp::resolver::iterator())
            throw std::runtime_error("resolve");

        endpoint_ = iterator->endpoint();
    }

    void start()
    {
        start_connect();
        service_.run();
    }

private:
    void start_connect()
    {
        std::cout << "Trying " << endpoint_ << "...\n";

        socket_ = std::make_shared<tcp::socket>(service_);

        socket_->async_connect(endpoint_,
            boost::bind(&client::handle_connect, this, _1));

    }

    void handle_connect(const boost::system::error_code& ec)
    {
        if (ec)
        {
            std::cout << "Connect error: " << ec.message() << "\n";
            start_connect();
        }
        else
        {
            std::cout << "Connected to " << endpoint_ << "\n";
            start_read();
        }
    }

    void start_read()
    {
        boost::asio::async_read_until(*socket_, input_buffer_, '\n',
            boost::bind(&client::handle_read, this, _1));
    }

    void handle_read(const boost::system::error_code& ec)
    {
        if (!ec)
        {
            std::string line;
            std::istream is(&input_buffer_);
            std::getline(is, line);

            if (!line.empty())
                std::cout << "Received: " << line << "\n";

            start_read();
        }
        else
        {
            std::cout << "Error on receive: " << ec.message() << "\n";
            start_connect();
        }
    }

private:
    std::shared_ptr<tcp::socket> socket_;
    boost::asio::io_service service_;
    boost::asio::ip::tcp::endpoint endpoint_;
    boost::asio::streambuf input_buffer_;
};

Можно ли занять только один клиентский порт за все время выполнения программы?Или, по крайней мере, не меняйте порт при каждой попытке подключения к недоступному серверу.Я думаю, что явная установка клиентского порта не является хорошим способом.Попытка не создавать заново сокет каждый раз, но в этом случае невозможно восстановить соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...