boost::async_read_some连续接收数据

我在最近工作的时候用到了boost的http_server程序,这个http_server是一个框架用于接收并解析http协议。这个框架在接收get请求时没有任何问题,当接收post数据时,当数据大于>2k时,无法正确接收,后来发现sync_read_some函数一次只能接收大约1k数据,如果要接收大数据,需要反复接收,自己修改了几天,将经验分享一下。

//接收数据的buffer

boost::array buffer_;

//数据需要多次接收,将多次接收的数据都放入data中

std::string data;

voidconnection::start()

{

//超时限制

  timer.expires_from_now(boost::posix_time::microseconds(1000000));

  timer.async_wait(boost::bind(&connection::close_connect1,this)); 

 

  buffer_.data()[0]= '\0';

  //开始接收数据

  socket_.async_read_some(boost::asio::buffer(buffer_),

  boost::bind(&connection::handle_read1,shared_from_this(),

  boost::asio::placeholders::error,      

  boost::asio::placeholders::bytes_transferred,data));

  return;

}voidconnection::handle_read1(const boost::system::error_code& e,std::size_tbytes_transferred,string& data)

{

//如果超时,返回空

if(!m_flag)

{

m_flag = true;

    request_handler_.handle_request1(request_,reply_);

   boost::asio::async_write(socket_,reply_.to_buffers(),

   boost::bind(&connection::handle_write,shared_from_this(),

   boost::asio::placeholders::error));

   

   boost::system::error_codeignored_ec;

    socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both,ignored_ec);

   return;

}

//如果接收有错误或者接收的数据长度=0,和超时处理一致

if(e ||bytes_transferred==0)

{

request_handler_.handle_request1(request_,reply_);

      boost::asio::async_write(socket_,reply_.to_buffers(),

          boost::bind(&connection::handle_write,shared_from_this(),

            boost::asio::placeholders::error));

    boost::system::error_codeignored_ec;

    socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both,ignored_ec);

    return;

}else

{

buffer_.data()[bytes_transferred]= '\0';

data = data +buffer_.data();

//表示接收到了结束标志

if(data.find("|*|*|") != string::npos)

{

int pos =data.find("|*|*|");

printf("pos=%d\n",pos);

    data= data.substr(0,pos);

    

        if(data.length()>0)

        {

//时钟取消

        timer.cancel();

        //用于处理接收的数据并将处理完的数据返回去,处理完的数据存储在reply中

         request_handler_.handle_request_pos(request_,reply_,data);

         boost::asio::async_write(socket_,reply_.to_buffers(),

              boost::bind(&connection::handle_write,shared_from_this(),

                boost::asio::placeholders::error));

        }

        else{

        request_handler_.handle_request1(request_,reply_);

          boost::asio::async_write(socket_,reply_.to_buffers(),

              boost::bind(&connection::handle_write,shared_from_this(),

                boost::asio::placeholders::error));

        }

        boost::system::error_codeignored_ec;

        socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both,ignored_ec);

        return;

    

  }

  //如果上面的if条件不满足,表示还在等待接收数据

  socket_.async_read_some(boost::asio::buffer(buffer_),

      boost::bind(&connection::handle_read1,shared_from_this(),

        boost::asio::placeholders::error,

        boost::asio::placeholders::bytes_transferred,

       data));

 } 

 源博客地址:点击打开链接

你可能感兴趣的:(boost::async_read_some连续接收数据)