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

Posted

技术标签:

【中文标题】使用 boost::asio::ip::tcp::socket 作为 shared_ptr【英文标题】:Use boost::asio::ip::tcp::socket as a shared_ptr 【发布时间】:2016-02-26 22:42:56 【问题描述】:

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

由于套接字需要io_service,这是我目前所做的:

并且我需要将打开的套接字作为一个类成员,如下所示:

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】:

此行试图复制套接字,这是不允许的。复制构造函数不公开。

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

Connect::Connect()

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

      if (error)
            -- handle error --

      isConnected = true;
   

【讨论】:

以上是关于使用 boost::asio::ip::tcp::socket 作为 shared_ptr的主要内容,如果未能解决你的问题,请参考以下文章

boost::asio::ip::tcp::iostream,首先启动客户端并等待服务器?

boost :: asio :: ip :: tcp :: iostream,首先启动客户端并等待服务器?

boost::asio::ip::tcp实现网络通信的小例子

boost::asio::ip::tcp::resolver::resolve() 永远阻塞

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

如何获取 boost::asio::ip::tcp::socket 的 IP 地址?