boost::async_read_some连续接收数据

来源:互联网 发布:人际网络网上商城 编辑:程序博客网 时间:2024/06/06 17:58
  1. <span style="font-size:18px">我在最近工作的时候用到了boost的http_server程序,这个http_server是一个框架用于接收并解析http协议。这个框架在接收get请求时没有任何问题,当接收post数据时,当数据大于>2k时,无法正确接收,后来发现sync_read_some函数一次只能接收大约1k数据,如果要接收大数据,需要反复接收,自己修改了几天,将经验分享一下。  
  2. //接收数据的buffer  
  3. boost::array<char, 8192> buffer_;  
  4. //数据需要多次接收,将多次接收的数据都放入data中  
  5. std::string data;  
  6. void connection::start()  
  7. {  
  8. //超时限制  
  9.   timer.expires_from_now(boost::posix_time::microseconds(1000000));  
  10.   timer.async_wait(boost::bind(&connection::close_connect1,this));   
  11.   
  12.   buffer_.data()[0] = '\0';  
  13.   //开始接收数据  
  14.   socket_.async_read_some(boost::asio::buffer(buffer_),  
  15.   boost::bind(&connection::handle_read1, shared_from_this(),  
  16.   boost::asio::placeholders::error,         
  17.   boost::asio::placeholders::bytes_transferred,data));  
  18.   return;  
  19. }void connection::handle_read1(const boost::system::error_code& e,std::size_t bytes_transferred,string& data)  
  20. {  
  21. //如果超时,返回空  
  22. if(!m_flag)  
  23. {  
  24. m_flag = true;  
  25.     request_handler_.handle_request1(request_, reply_);  
  26.    boost::asio::async_write(socket_, reply_.to_buffers(),  
  27.    boost::bind(&connection::handle_write, shared_from_this(),  
  28.    boost::asio::placeholders::error));  
  29.      
  30.    boost::system::error_code ignored_ec;  
  31.     socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec);  
  32.    return;  
  33. }  
  34. //如果接收有错误或者接收的数据长度=0,和超时处理一致  
  35. if(e || bytes_transferred==0)  
  36. {  
  37. request_handler_.handle_request1(request_, reply_);  
  38.       boost::asio::async_write(socket_, reply_.to_buffers(),  
  39.           boost::bind(&connection::handle_write, shared_from_this(),  
  40.             boost::asio::placeholders::error));  
  41.     boost::system::error_code ignored_ec;  
  42.     socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec);  
  43.     return;  
  44. }else  
  45. {  
  46. buffer_.data()[bytes_transferred] = '\0';  
  47. data = data + buffer_.data();  
  48. //表示接收到了结束标志  
  49. if (data.find("|*|*|") != string::npos)  
  50. {  
  51. int pos = data.find("|*|*|");  
  52. printf("pos=%d\n",pos);  
  53.     data = data.substr(0,pos);  
  54.       
  55.         if(data.length()>0)  
  56.         {  
  57. //时钟取消  
  58.         timer.cancel();  
  59.         //用于处理接收的数据并将处理完的数据返回去,处理完的数据存储在reply中  
  60.          request_handler_.handle_request_pos(request_, reply_,data);  
  61.          boost::asio::async_write(socket_, reply_.to_buffers(),  
  62.               boost::bind(&connection::handle_write, shared_from_this(),  
  63.                 boost::asio::placeholders::error));  
  64.         }  
  65.         else{  
  66.         request_handler_.handle_request1(request_, reply_);  
  67.           boost::asio::async_write(socket_, reply_.to_buffers(),  
  68.               boost::bind(&connection::handle_write, shared_from_this(),  
  69.                 boost::asio::placeholders::error));  
  70.         }  
  71.         boost::system::error_code ignored_ec;  
  72.         socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec);  
  73.         return;  
  74.       
  75.   }</span>
原创粉丝点击