使用 boost::asio 库与 PostgreSQL 连接到 docker 容器

问题描述 投票:0回答:0

大家。这是我的第一个问题,所以请不要因为我的经验不足而讨厌我。 我试图在一堆技术中写一个简单的信使:c++、cmake、qt、boost、docker。 概念是

  1. 客户端 - 可以连接到服务器并与其交换消息
  2. server - 可以接受客户端的连接并处理它们,连接到 Docker 中的 DB 并与它们交换消息
  3. DB - 内部运行 PostgreSQL 的“vanilla”(原始)docker-container

我编写了这个组件的主要部分,运行了 DB 并尝试将我的服务器连接到 DB,但每次我这样做 - 什么都没有发生。可能是我很愚蠢,但我在任何地方都找不到任何关于我的问题的信息。所以我决定在这里问一下。 这是连接的实现:

班级

class Server : public ServerI {
    private:
        socket_ptr _sock;
        io_service & _service;

        size_t _port{};
        ip::address _address;
        ip::tcp::endpoint _ep;

        std::map<size_t, Session &> _sessions;
    public:
        Server(io_service & service) : _service(service) {}
        ~Server() {
            // "kill" all threads (sessions)
            for (auto & s : _sessions) {
                s.second.th.detach();
            }
        }

        void waitForConnection() override;
        void sessionHandler() override;
        void connectToDB(const ConnectionInfo &c_inf = {"", 0}) override;

    private:

        void setEndpoint(const ip::tcp::endpoint & ep);

        void connect();
        void disconnect();

        size_t request(const std::string & target);
        std::string getResponse();
    };

功能:

void Server::connectToDB(const ConnectionInfo &c_inf) {
        std::cout << "begin" << std::endl;
        ip::tcp::endpoint ep( ip::address::from_string(c_inf.s_ip), c_inf.port);
        std::cout << ep.address() << " " << ep.port() << std::endl;
        this->setEndpoint(ep);
        std::cout << _ep << " " << _port << std::endl;
        try {
            this->connect();
        } catch(...) {
            std::cout << "connection error" << std::endl;
        }
    }

    //===============================//

    void Server::setEndpoint(const ip::tcp::endpoint & ep) {
        _ep = ep;
        _port = ep.port();
        _address = ep.address();
        std::cout << "ep, port, address are set" << std::endl;
        _sock = socket_ptr(new ip::tcp::socket(_service));
    }

    void Server::connect() {
        try {
            // just a hardcode - tried to debug this
            _sock->connect(ip::tcp::endpoint(ip::address::from_string("localhost:32769"), 5432)); //(_ep);
        } catch (boost::system::system_error & err) {
            std::cerr << "connection error: " << err.what() << std::endl;
            return;
        }
    }

使用示例

server->connectToDB({"0.0.0.0", 32769});

码头工人: 我只是在容器菜单中的相应想象上按下了运行按钮 enter image description here

接受任何建议

我做了什么: 尝试硬编码地址和调试,但错误是由套接字库函数引起的,所以我不知道该怎么办。 可能仅仅运行容器是不够的,我必须设置数据库或其他什么。 可能是我连接的 ip/port 格式错误。

c++ docker boost boost-asio docker-container
© www.soinside.com 2019 - 2024. All rights reserved.