在类中重新初始化asio::socket

Reinitialise asio::socket in class

本文关键字:asio socket 初始化      更新时间:2023-10-16

我发现,如果我想使用boost::socket作为类成员,我必须使用初始化列表定义它,甚至必须在构造函数调度之前定义
这意味着,我必须用一些虚拟参数证明它的构造函数,当我有需要的数据时,我需要再次重新初始化它。

client.hpp

class SocketClient {
    private:
       int port; //Port, currently unused
       boost::asio::io_service io_service;  //This is my "dummy" parameter
       boost::asio::ip::tcp::resolver::iterator endpoint_iterator;
       boost::asio::ip::tcp::socket sock; //Socket class instance
     
    public:
       void init(const char*, const char* );
       SocketClient::SocketClient():sock(io_service){};  //Giving empty "io_service" to  the "sock"
       bool read(int bytes, char *text);
       bool send(int length, char *text);
       bool send(std::string text);
       unsigned int timeout;
};

之后,当init()方法被调用时,我需要为sock提供初始化的io_service。我不知道该怎么做:

client.h

void SocketClient::init(const char* ip_a, const char* port_a) {
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query(ip_a, port_a);
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    //Error (unsuported operator =):
    sock=boost::asio::ip::tcp::socket(io_service);
    //Error (term does not evaluate to a function taking 1 arguments):
    sock(io_service);
}

在这里你可以看到整个项目,没有任何删除

您已经初始化了套接字,现在只需要连接

tcp::resolver resolver(io_service);
tcp::resolver::query query(tcp::v4(), ip_a,port_a);
tcp::resolver::iterator iterator = resolver.resolve(query);
sock.connect(*iterator);