streamsize  sgetn(char_type *store,streamsize n)    返回缓冲区下n个字符并存储到store中,并将缓冲区位置后移n个字节

代码说明:本来是想不断的通过sgetn函数获取到streambuf的内容,由于没有完全理解sgetn获取流的方式,导致了问题的产生

int Teststreambuf()

{

boost::asio::streambuf request;

std::ostream request_stream(&request);

request_stream << "GET /cs/restfull/operationRestfullApi/testGet/ HTTP/1.1\r\n";

request_stream << "Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";

request_stream << "Accept-Language: zh-CN\r\n";

request_stream << "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)\r\n";

request_stream << "Host: " << "192.168.0.88:8080" << "\r\n";

request_stream << "Connection: Keep-Alive\r\n\r\n";

//当第一次使用sgetn函数的时候,已经将所有的数据读完,指向流的结束位置

char buf[1024] = { 0 };

int len = request.size();

request.sgetn(buf, len);

//当第二次使用sgetn函数的时候,由于第一次函数调用指向了流的结束位置,

//所以第二次读取到的buf1是空的

char buf1[1024] = { 0 };

int len1 = request.size();

request.sgetn(buf1, len1);

return 0;

}

实际的测试环境:希望组装完成一次HTTP请求之后,循环发送构建的数据包,达到压力测试的结果,但是在接收端只是接收到一次的数据,初步怀疑是服务器的代码有问题,后面才发现是sgetn函数的使用方法有问题

#include <iostream>

#include <fstream>

#include <string>

#include <boost/asio.hpp>

using namespace std;

using namespace boost::asio;

int Teststreambuf()

{

io_service iosev;

ip::tcp::socket socket(iosev);

ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 7002);

boost::system::error_code ec;

socket.connect(ep, ec);

if (ec) return -1;

boost::asio::streambuf request;

std::ostream request_stream(&request);

request_stream << "POST /cs/restfull/operationRestfullApi/testPost HTTP/1.1\r\n";

request_stream << "Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";

request_stream << "Accept-Language: zh-CN\r\n";

request_stream << "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)\r\n";

request_stream << "Host: " << "192.168.0.88:8080" << "\r\n";

request_stream << "Connection: Keep-Alive\r\n\r\n";

while (1)

{

//第一次调用write之后,request的数据已经发送完毕,作为一个流,已经指向数据的末尾,所以

//当再次循环的时候发送的数据len==0,本意是循环发送上面的HTTP数据,对服务器进行压力测试

size_t len = boost::asio::write(socket, request);

std::cout << len << std::endl;

::Sleep(300);

}

return 0;

}

修改之后的代码

#include <iostream>

#include <fstream>

#include <string>

#include <boost/asio.hpp>

using namespace std;

using namespace boost::asio;

int Teststreambuf()

{

io_service iosev;

ip::tcp::socket socket(iosev);

ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 7002);

boost::system::error_code ec;

socket.connect(ep, ec);

if (ec) return -1;

boost::asio::streambuf request;

std::ostream request_stream(&request);

request_stream << "POST /cs/restfull/operationRestfullApi/testPost HTTP/1.1\r\n";

request_stream << "Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";

request_stream << "Accept-Language: zh-CN\r\n";

request_stream << "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)\r\n";

request_stream << "Host: " << "192.168.0.88:8080" << "\r\n";

request_stream << "Connection: Keep-Alive\r\n\r\n";

//跟上面的不一样的做法,是将request的数据一次性读取到buf数组中,然后循环发送buf的数据内容

char buf[1024] = { 0 };

request.sgetn(buf, request.size());

while (1)

{

size_t len = boost::asio::write(socket, boost::asio::buffer(buf));

std::cout << len << std::endl;

::Sleep(300);

}

return 0;

}

本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1954702,如需转载请自行联系原作者

boost::asio::streambuf 基本用法和注意事项相关推荐

  1. boost::asio译文

    boost::asio译文 Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布( ...

  2. boost asio 简单示例

    客户端: #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> #incl ...

  3. Boost.Asio技术文档汇总

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  4. linux串口boost,Boost串口通信第一课 boost::asio::serial_port基本使用

    boost库有一个asio,支持串口通信. 步骤: 1.产生一个boost::asio::io_service(前摄模式,类似于完成端口,不过,可以针对不同IO对象) 2.构造一个boost::asi ...

  5. 基于boost asio实现的支持ssl的通用socket框架

    情景分析    现已存在一个可用稳定的异步客户端类http_client_base,该类基于boost asio实现了连接服务器,发送请求,获取响应和解析http数据等操作,该类的大致实现框架如下   ...

  6. boost.asio无锁异步并发

    简介 给出一个不安全的情况,假设我们有一个socket用于和用户通信,用户会发送多个请求,我们处理请求需要一定的时间,同时使用异步并发的模型来处理对应的请求,即一个io_context::run会有多 ...

  7. boost.asio异步并发Tcp服务器

    简介 boost的asio采用的是Proactor模型,该模型的核心思想就是异步IO,IO在事件循环中,每个异步IO都绑定对应的回调函数,当IO完成后,对应的回调函数会在事件循环中执行. 异步并发模型 ...

  8. boost::asio::io_service的stop()和reset()和stopped()函数

    ◆boost::asio::io_service使用时的注意事项: ①请让boost::asio::io_service和boost::asio::io_service::work搭配使用. ②想让e ...

  9. Boost串口通信 boost::asio::serial_port基本使用

    Boost串口通信 boost::asio::serial_port基本使用 boost库有一个asio,支持串口通信. 步骤: 1.产生一个boost::asio::io_service(前摄模式, ...

最新文章

  1. 王豪:HW265到“HW266”
  2. 警告: Could not load driverClass com.mysql.cj.jdbc.Driver
  3. windows charles response 乱码解决办法
  4. bzoj3522 Hotel
  5. pla3d打印材料密度_口腔修复体制作用3D打印金属粉末的成型工艺与性能控制要点概述...
  6. WPF 仿QQ登录框翻转效果
  7. javascript arguments
  8. 中文编程语言Z语言开源正式开源!!!
  9. java枚举类型转换为Struts2的select的数据
  10. 【Elasticsearch】bulk default_local reports failures when export documents
  11. 15数字华容道解法 图解_密不外传的点穴秘技:15个穴位的取穴、点法、解法(上)...
  12. 在matlab中进行遥感影像地理坐标的相互转换
  13. 【转】snort 笔记2 ----- 规则编写
  14. 使用Hex2Bin软件将Hex文件转Bin文件
  15. 线程状态的区别 blocked waitting ,join 详解
  16. python tkinter界面随分辨率自动调整尺寸,Tkinter画布自动调整大小
  17. 圣诞音乐贺卡beepMusic_v6d;--铃儿响叮当;
  18. alexnet 模型详解以及模型的可视化
  19. autocomplete=“off“ 阻止chrome浏览器回填账号密码
  20. 多个excel合并到一个excel的不同sheet中

热门文章

  1. 两种超级智能,哪一个对人类未来影响更为深远?
  2. 5G的3大应用场景落地开花,中国或将引领全球5G产业发展
  3. 人工智能重构下的金融场景
  4. 阿里、腾讯基本薪资曝光,资深算法工程师24万美元,高级研究员26万美元
  5. 假如鲁迅是程序员......
  6. 用 Python 实现隐身,我可以
  7. 什么才是程序员摸鱼的最高境界?
  8. Hadoop 之父趣事:用儿子的大象玩偶为大数据项目命名
  9. Confluence 6 重构 ancestor 表
  10. 阿里云容器Kubernetes监控(二) - 使用Grafana展现Pod监控数据