连接失败时如何防止端口更改

时间:2019-04-04 13:20:15

标签: c++ windows sockets tcp asio

我有一些使用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_;
};

在程序的整个执行时间内是否可以仅占用一个客户端端口?或者至少不要为每次尝试连接到不可用的服务器更改端口。 我认为显式设置客户端端口不是一个好方法。试图不每次都重新创建套接字,但是在这种情况下,不可能重新建立连接。

0 个答案:

没有答案