boost :: socket只接收一条消息

时间:2016-03-09 18:30:35

标签: c++ sockets boost

我正在使用boost::asio编写简单的服务器。 目前我已准备好接收数据的服务器的一部分。 但我有问题。 Boost::asio只收到一条消息(我的客户端程序发送多条消息)。

收到消息后,我必须做些什么才能从同一个客户端收到另一条消息?

TCPConnection::TCPConnection(boost::asio::io_service& io_service)
                            : socket_(io_service),
                              socketActive(true)
{
    Traces() << "\n" << "LOG: TCPConnection::TCPConnection(boost::asio::io_service& io_service) : socket_(io_service)";
}

void TCPConnection::Start()
{
  Traces() << "\n" << "LOG: void TCPConnection::Start()";


  socket_.async_read_some(boost::asio::buffer(buffer_),
      boost::bind(&TCPConnection::HandleRead, shared_from_this(),
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred));
}

void TCPConnection::HandleRead(const boost::system::error_code& e,
    std::size_t bytes_transferred)
{
  Traces() << "\n" << "LOG: void TCPConnection::HandleRead(const boost::system::error_code& e, std::size_t bytes_transferred)";

  if (!e)
  {
    Traces() << "\n" << "LOG: New message";    

    Message tempMessage;
    tempMessage.CopyData((boost::shared_ptr<TCPConnection>)this, buffer_.data());
    messageQueue->PushBack(tempMessage);
  }
  else if (e != boost::asio::error::operation_aborted)
  {
    Traces() << "\n" << "LOG: Close connection";
    this->Stop();
  }
}

1 个答案:

答案 0 :(得分:1)

每次成功读取数据时,都需要请求io_service / socket再次处理数据读取。我通常的解决方案如下:

void handle_read(asio::error_code ec, size_t bytes_read) {
    if(!ec) {
        /*Do Stuff*/
        socket.async_read(/*buffer*/, handle_read);
    } else {
        /*Error handling*/
    }
}

我没有语法检查我在这里提供的代码,但你应该得到正确的想法。