0

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);
}

ここでは、何も削除されていないプロジェクト全体を見ることができます。

4

1 に答える 1

2

すでにsokectが初期化されているので、接続するだけで済みます

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);
于 2013-03-14T23:24:45.830 に答える