boost::asio::read引发编译错误:'read_some'不是'boost :: shared_ptr <boost :: asio :: ip :: tcp :: socket>'的成员。

3
我正在尝试通过特定协议从服务器获取数据,并构建客户端。我知道我的代码不是最好的,但目前我还在尝试使用Boost ASIO的基本功能。
我想实现一个TCP读取函数,该函数会阻塞直到接收到特定数量的字节。
我的问题是: 当我调用boost :: asio :: read或boost :: asio :: write时,我会遇到以下错误:
错误C2039:'read_some':不是boost :: shared_ptr的成员
我正在使用VS2013 Professional,Boost 1.55.00(预编译)。
这是我的代码:(您可以通过注释“//HEEERE”找到该行)
boost :: mutex cout_lock;
int main()
{
  // creating io_service
  boost::shared_ptr<boost::asio::io_service> io_service(new boost::asio::io_service);
  // creating work and assigning it to io_service
  boost::shared_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(*io_service));
  // creating strand and assigning it to io_service
  boost::shared_ptr<boost::asio::io_service::strand> strand(new boost::asio::io_service::strand(*io_service));

  // creating socket
  boost::shared_ptr<boost::asio::ip::tcp::socket>   socket(new boost::asio::ip::tcp::socket(*io_service));

  try {
    // creating resolver
    boost::asio::ip::tcp::resolver resolver(*io_service);
    // creating query
    boost::asio::ip::tcp::resolver::query query(IPConfig_str, boost::lexical_cast<std::string>(IPConfig_PortNr));
    // creating iterator
    boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
    // creating  endpoint
    boost::asio::ip::tcp::endpoint endpoint = *iterator;

    // connecting synchronously
    socket->connect(endpoint);
  }
  catch(std::exception &ex) {
    cout_lock.lock();
    std::cout << "[main]:\t" << "Exception:" << ex.what() << std::endl;
    cout_lock.unlock();
  }

  // Create Query

  CommandCreator CMDCreator;
  Command sendCommand;
  CMDCreator.Create_fpga_GetSwVers(&sendCommand);
  std::cout << std::endl;
  std::cout << "SENT:" << std::endl;
  for (int i = 0; i < sendCommand.length; i++)
  {
    std::cout << std::hex << std::setw(2) << std::setfill('0') << int(sendCommand.buffer[i]) << ", ";
  }
  std::cout << std::endl;

  // Send Query
  boost::system::error_code ec;
  socket->async_send(boost::asio::buffer(sendCommand.buffer, sendCommand.length), boost::asio::transfer_all());

  Sleep(300); // sleep 100 ms (at least 85 <- not stable!)


  // Receive Answer - Header
  Command receiveCommandHeader;
  receiveCommandHeader.InitBuffer(4);

  // Async
//  socket->async_receive(boost::asio::buffer(receiveCommandHeader.buffer, receiveCommandHeader.length), 0, boost::bind(HandleRead, ec));

//HEEERE
  boost::asio::read(socket, boost::asio::buffer(receiveCommandHeader.buffer, receiveCommandHeader.length), boost::asio::transfer_all(), ec);    

  //shutting down
  socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
  socket->close(ec);

  io_service->stop();


  return 0;
}


class Command
{
  friend class CommandCreator;  // TODO: is there a better and as simple method as a friend class?

public:
  Command() : buffer(0)
  {}

  virtual ~Command()
  {
    delete[] buffer;
    buffer = 0;
  }

  void InitBuffer(int const len)
  {
    this->length = len;
    this->buffer = new uint8_t[len];
  }

  uint8_t* buffer;
  int length;
};

实际上,问题出现在boost库的read.hpp文件中,其中从'stream_'调用async_read_some函数。

void operator()(const boost::system::error_code& ec,
        std::size_t bytes_transferred, int start = 0)
    {
      std::size_t n = 0;
      switch (start_ = start)
      {
        case 1:
        n = this->check_for_completion(ec, total_transferred_);
        for (;;)
        {
          stream_.async_read_some(
              boost::asio::buffer(buffer_ + total_transferred_, n),
              BOOST_ASIO_MOVE_CAST(read_op)(*this));
          return; default:
          total_transferred_ += bytes_transferred;
          if ((!ec && bytes_transferred == 0)
              || (n = this->check_for_completion(ec, total_transferred_)) == 0
              || total_transferred_ == boost::asio::buffer_size(buffer_))
            break;
        }

        handler_(ec, static_cast<const std::size_t&>(total_transferred_));
      }
    }
1个回答

9
好的,我刚刚找到了问题。
// creating socket
  boost::shared_ptr<boost::asio::ip::tcp::socket>   socket(new boost::asio::ip::tcp::socket(*io_service));

我创建了一个指针作为套接字,但是所有的读取接口,如read、read_some和其他boost库函数都需要对象。因此,添加解引用运算符就可以解决这个问题:

  boost::asio::async_read(*socket, boost::asio::buffer(receiveCommandHeader.buffer, receiveCommandHeader.length),
    boost::asio::transfer_all(), boost::bind(HandleRead, ec));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接