boost::async_read_some连续接收数据
来源:互联网 发布:人际网络网上商城 编辑:程序博客网 时间:2024/06/06 17:58
- <span style="font-size:18px">我在最近工作的时候用到了boost的http_server程序,这个http_server是一个框架用于接收并解析http协议。这个框架在接收get请求时没有任何问题,当接收post数据时,当数据大于>2k时,无法正确接收,后来发现sync_read_some函数一次只能接收大约1k数据,如果要接收大数据,需要反复接收,自己修改了几天,将经验分享一下。
- //接收数据的buffer
- boost::array<char, 8192> buffer_;
- //数据需要多次接收,将多次接收的数据都放入data中
- std::string data;
- void connection::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;
- }void connection::handle_read1(const boost::system::error_code& e,std::size_t bytes_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_code ignored_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_code ignored_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_code ignored_ec;
- socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec);
- return;
- }</span>
阅读全文
0 0
- boost::async_read_some连续接收数据
- boost::async_read_some连续接收数据
- boost::async_read_some连续接收数据
- boost::async_read_some连续接收数据
- boost::asio::socket::async_read_some
- async_read_some
- QTcpSocket的连续发送数据和连续接收数据
- QTcpSocket的连续发送数据和连续接收数据
- Python入门:socket连续接收客户端数据
- boost 里头 async_read_some和async_read有什么区别哦
- boost中的socket的async_read_some() 方法会导致严重的阻塞
- 用数组实现堆栈 && 判断接收到的数据是否连续
- PIC单片机在连续接收串口数据时遇到的小问题
- boost接收连接及数据时的错误及tcp状态转化图
- async_read_some async_read区别
- asnyc_read,async_read_some, async_receive
- windows socket编程,连续发送接收
- Boost的UDP接收server示例
- spfa模板
- MongoDB的安装
- SSM(SpringMVC+Spring+Mybatis)框架搭建
- 选择框付默认值
- node.js事件循环,事件驱动程序。
- boost::async_read_some连续接收数据
- Scroll滑动分析-《Android群英传》第五章
- Computer Vision阅读文章总结纪要
- xiunobbs回帖时间排序修改
- 将文件夹下的多个文件的内容合并到一个文件中
- GCC 关于禁用编译Kernel 是warning as a error
- 广告轮播
- 实验
- hdu 1231 最大连续子序列 ,1003 Max Sum;