千家信息网

boost::asio::streambuf 基本用法和注意事项

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,streamsize sgetn(char_type *store,streamsize n) 返回缓冲区下n个字符并存储到store中,并将缓冲区位置后移n个字节代码说明:本来是想不断的通过sget
千家信息网最后更新 2026年11月01日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, p_w_picpath/jpeg, application/xaml+xml, p_w_picpath/gif, p_w_picpath/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

#include

#include

#include


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, p_w_picpath/jpeg, application/xaml+xml, p_w_picpath/gif, p_w_picpath/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

#include

#include

#include


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, p_w_picpath/jpeg, application/xaml+xml, p_w_picpath/gif, p_w_picpath/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;

}


数据 函数 循环 代码 位置 指向 时候 第一次 问题 测试 内容 压力 服务器 缓冲区 面的 服务 缓冲 一次性 不断 使用方法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技网 互联网科技公司经营范围 互联网科技产业 厦门中拓互联网络科技有限公司 新华互联网科技学院 金融科技 互联网金融 期待互联网科技 互联网科技公司有哪些 互联网科技视频素材 广西拼得多互联网科技有限公司 天速互联网络科技有限公司 常德市电业局互联网科技部 互联网科技产业特征 新兴科技互联网创新大赛颁奖典礼 特约风豹互联网科技为什么扣费 云鲸互联网络科技有限公司 互联网科技手机排行榜 陕西九四连强互联网科技有限公司 互联网领先科技活动 安徽九吞吴互联网科技有限公司 互联网是第几次科技革命的成果 互联网科技公司怎么样 火传媒上海互联网科技 互联网科技论坛 上海电发互联网科技有限公司 宁波青枫互联网科技有限公司 互联网科技实习生岗位职责 银川新华互联网科技职业技术培训学校图片 互联网科技项目计划书材料类 互联网科技创新方面的资料
0