boost::asio::streambuf 基本用法和注意事项
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;
}
boost::asio::streambuf 基本用法和注意事项相关推荐
- boost::asio译文
boost::asio译文 Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布( ...
- boost asio 简单示例
客户端: #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> #incl ...
- Boost.Asio技术文档汇总
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...
- linux串口boost,Boost串口通信第一课 boost::asio::serial_port基本使用
boost库有一个asio,支持串口通信. 步骤: 1.产生一个boost::asio::io_service(前摄模式,类似于完成端口,不过,可以针对不同IO对象) 2.构造一个boost::asi ...
- 基于boost asio实现的支持ssl的通用socket框架
情景分析 现已存在一个可用稳定的异步客户端类http_client_base,该类基于boost asio实现了连接服务器,发送请求,获取响应和解析http数据等操作,该类的大致实现框架如下 ...
- boost.asio无锁异步并发
简介 给出一个不安全的情况,假设我们有一个socket用于和用户通信,用户会发送多个请求,我们处理请求需要一定的时间,同时使用异步并发的模型来处理对应的请求,即一个io_context::run会有多 ...
- boost.asio异步并发Tcp服务器
简介 boost的asio采用的是Proactor模型,该模型的核心思想就是异步IO,IO在事件循环中,每个异步IO都绑定对应的回调函数,当IO完成后,对应的回调函数会在事件循环中执行. 异步并发模型 ...
- boost::asio::io_service的stop()和reset()和stopped()函数
◆boost::asio::io_service使用时的注意事项: ①请让boost::asio::io_service和boost::asio::io_service::work搭配使用. ②想让e ...
- Boost串口通信 boost::asio::serial_port基本使用
Boost串口通信 boost::asio::serial_port基本使用 boost库有一个asio,支持串口通信. 步骤: 1.产生一个boost::asio::io_service(前摄模式, ...
最新文章
- 王豪:HW265到“HW266”
- 警告: Could not load driverClass com.mysql.cj.jdbc.Driver
- windows charles response 乱码解决办法
- bzoj3522 Hotel
- pla3d打印材料密度_口腔修复体制作用3D打印金属粉末的成型工艺与性能控制要点概述...
- WPF 仿QQ登录框翻转效果
- javascript arguments
- 中文编程语言Z语言开源正式开源!!!
- java枚举类型转换为Struts2的select的数据
- 【Elasticsearch】bulk default_local reports failures when export documents
- 15数字华容道解法 图解_密不外传的点穴秘技:15个穴位的取穴、点法、解法(上)...
- 在matlab中进行遥感影像地理坐标的相互转换
- 【转】snort 笔记2 ----- 规则编写
- 使用Hex2Bin软件将Hex文件转Bin文件
- 线程状态的区别 blocked waitting ,join 详解
- python tkinter界面随分辨率自动调整尺寸,Tkinter画布自动调整大小
- 圣诞音乐贺卡beepMusic_v6d;--铃儿响叮当;
- alexnet 模型详解以及模型的可视化
- autocomplete=“off“ 阻止chrome浏览器回填账号密码
- 多个excel合并到一个excel的不同sheet中