使用boost :: asio :: ip :: tcp :: socket作为shared_ptr

时间:2016-02-26 22:42:57

标签: c++ sockets boost tcp

我正在使用boost::asio构建一个通信类来封装客户端ftp连接。我想在类构造函数上创建套接字并在类生命周期中使用它。

由于socket需要一个io_service,这就是我到目前为止所做的:

我需要将open socket作为类成员保存,如:

class Connect {
    boost::asio::io_service ioService;
    std::shared_ptr<boost::asio::ip::tcp::socket> currentSocket;
    bool isConnected;
}

Connect::Connect()
{
      boost::asio::ip::tcp::socket socket(ioService);
      socket.connect(--params--);

      if (error)
            -- handle error --

      currentSocket = std::make_shared<boost::asio::ip::tcp::socket>(socket); <<=== ERROR HERE

      isConnected = true;
}   

Connect::~Connect()
{
    currentSocket->disconnect();
}

Connect::Read()
{
    currentSocket->async_receive(...);
}

我得到的错误是:

c:\boost_1_60\boost\asio\basic_socket.hpp(1513): error C2248: 'boost::asio::basic_io_object<IoObjectService>::basic_io_object' : cannot access private member declared in class 'boost::asio::basic_io_object<IoObjectService>'

我正在使用VS2012。

这是在课堂生命周期中存储套接字的正确方法吗? 为什么会发生这种错误?

帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

此行正在尝试制作套接字的副本,这是不允许的。复制构造函数不公开。

为什么不首先简单地创建共享指针?

Connect::Connect()
{
      currentSocket = std::make_shared<boost::asio::ip::tcp::socket>(ioService);
      currentSocket->connect(--params--);

      if (error)
            -- handle error --

      isConnected = true;
}