У меня есть клиентское приложение, написанное с использованием 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_;
};
Можно ли занять только один клиентский порт за все время выполнения программы?Или, по крайней мере, не меняйте порт при каждой попытке подключения к недоступному серверу.Я думаю, что явная установка клиентского порта не является хорошим способом.Попытка не создавать заново сокет каждый раз, но в этом случае невозможно восстановить соединение.