boost::asio::buffer:获取缓冲区大小并防止缓冲区溢出?

2023-11-24

我有以下两个用于发送和接收数据包的函数。

void send(std::string protocol)
{
    char *request=new char[protocol.size()+1];
    request[protocol.size()] = 0;
    memcpy(request,protocol.c_str(),protocol.size());

    request_length = std::strlen(request);
    boost::asio::write(s, boost::asio::buffer(request, request_length));
}
void receive()
{
    char reply[max_length];
    size_t reply_length = boost::asio::read(s, boost::asio::buffer(reply, request_length));
    std::cout << "Reply is: ";
    std::cout.write(reply, reply_length);
    std::cout << "\n";
}

与这部分相关的问题boost::asio::buffer(reply, request_length)其中请求长度是发送数据包时最初设置的字符串的长度。如何在不知道的情况下检查缓冲区的大小request_length?另一个问题是如何防止缓冲区溢出?


要获取缓冲区的大小,boost::asio::buffer_size()可以使用函数。但是,在您的示例中,这很可能对您没什么用处。

正如缓冲区中所解释的overview、Boost.Asio使用缓冲区类来表示缓冲区。这些类提供了抽象并保护 Boost.Asio 操作免遭缓冲区溢出。虽然结果boost::asio::buffer()传递给操作时,不会传输元数据,例如缓冲区的大小或其基础类型。此外,这些缓冲区不拥有内存,因此应用程序有责任确保底层内存在缓冲区抽象的整个生命周期内保持有效。

The boost::asio::buffer()函数提供了一种创建缓冲区类的便捷方法,其中缓冲区的大小是从可能的类型推导出来的。当 Boost.Asio 能够推断出缓冲区长度时,Boost.Asio 操作在使用生成的缓冲区类型时将不会引发缓冲区溢出。但是,如果应用程序代码指定缓冲区的大小boost::asio::buffer(),那么应用程序有责任确保该大小不大于底层内存。

读取数据时,需要缓冲区。根本问题是,如果 Boost.Asio 不传输大小,如何知道要分配多少内存。这个问题有几个解决方案:

  • 通过以下方式查询套接字有多少数据可用socket::available(),然后相应地分配缓冲区。

    std::vector<char> data(socket_.available());
    boost::asio::read(socket_, boost::asio::buffer(data));
    
  • 使用Boost.Asio可以在内存中增长的类,例如boost::asio::streambuf。一些操作,例如boost::asio::read() accept streambuf对象作为其缓冲区,并将根据操作所需分配内存。但应提供完成条件;否则,操作将继续,直到缓冲区已满。

    boost::asio::streambuf data;
    boost::asio::read(socket_, data,
                      boost::asio::transfer_at_least(socket_.available()));
    
  • As Öö Tiib建议将长度作为通信协议的一部分。检查Boost.Asioexamples有关通信协议的示例。关注协议,不一定关注Boost.AsioAPI.

    • 在固定大小的协议中,数据生产者和消费者都使用相同大小的消息。由于阅读器知道消息的大小,因此阅读器可以提前分配缓冲区。
    • 在可变长度协议中,消息通常分为两部分:标头和主体。标头通常是固定大小的,并且可以包含各种元信息,例如主体的长度。这允许读取器将标头读入固定大小的缓冲区,提取主体长度,为主体分配缓冲区,然后读取主体。

      // Read fixed header.
      std::vector<char> data(fixed_header_size);
      boost::asio::read(socket_, boost::asio::buffer(data));
      
      protocol::header header(data);
      network_to_local(header); // Handle endianess.
      
      // Read body.
      data.resize(header.body_length());
      boost::asio::read(socket_, boost::asio::buffer(data));  
      
      protocol::body body(data);
      network_to_local(body); // Handle endianess.    
      
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost::asio::buffer:获取缓冲区大小并防止缓冲区溢出? 的相关文章

  • NHibernate同时将两列作为复合键和外键

    首先 我在网上和这里进行了彻底的搜索 但没有找到解决手头任务的明确解决方案 如果我的搜索不够准确并且这个答案已经发布 我深表歉意 问题 我有一张桌子 该表必须在两个字段上有一个主键 并且其他字段包含一些数据 作为主键的两个字段也必须是外键
  • TestContext.DataRow["MyColumnName"] 的替代品是什么

    在 Net Core 单元测试项目中使用 MSTest 我正在尝试使用 csv 数据源来提供测试方法的数据 以前 我会在 Net Framework 测试项目中使用如下所示的内容 DataSource Microsoft VisualStu
  • 用于清理 openssl EVP_PKEY 私钥内存的 C 代码

    我开始学习 C C 中的 OpenSSL 编程 我遇到的一个问题是 如何安全地清除私钥的内存 例如 我可能有代码 EVP PKEY private key PEM read bio PrivateKey bio RSA r EVP PKEY
  • CMake source_group() 无法在分层项目设置中正常工作

    在进行更改以使 CMake 项目具有分层文件夹管理后 source group 似乎不再正常工作 CMake 只是将所有内容转储到默认过滤器中 我尝试了各种正则表达式来从父级获取每个源文件的相对文件路径 甚至对父级 CMakeLists t
  • 关于我的编译器中缺少 stdafx.h(Windows 上的 mingw32)

    我有一个简单的问题 我注意到我的编译器中没有 stdafx h Windows 上的 mingw32 我应该拥有它吗 或者也许有办法绕过它 谢谢阅读 编辑 好的 这是我取出 stdafx h 的所有包含内容后的当前构建日志 http pas
  • 对于任何真实数据集,数据压缩比的最小可能值是多少

    我在写信ZLIB类似于嵌入式硬件压缩器的 API 它使用 deflate 算法来压缩给定的输入流 在进一步讨论之前 我想解释一下数据压缩率 数据压缩率定义为未压缩大小与压缩大小之间的比率 压缩比通常大于一 这意味着压缩数据通常比未压缩数据小
  • C# 中的序列化和对象版本控制

    如果我想序列化一个对象 我必须使用 Serializable 属性和所有成员变量将被写入该文件 我不知道如何进行版本控制 例如如果我添加一个新的成员变量 重命名变量或仅删除变量 然后打开 反序列化 文件 如何确定对象 文件版本 以便我可以正
  • 如何在 RestSharp 中使用 PUT?

    我想使用 PUT 但我只能找到如何使用 POST 的示例 我要发送的json数据是使用这个cURL命令发送的curl i H Content Type application json X PUT d status 1 http 192 1
  • 无法使用Boost.process

    我下载并打包了 1 54 0 版本的 Boost 库 我做了类似回答这个问题的一切 如何在 Visual Studio 2010 中使用 Boost https stackoverflow com questions 2629421 how
  • Qt:不完整类型和前向声明的使用无效

    我有一些误解 A h ifndef A H define A H include B h class A public B Q OBJECT public A endif A cpp include A h A A B ui gt blan
  • 显示与 C# 生成的表单相邻的另一种表单

    如何产生一种新形式 例如Form2 from Form1 但要确保Form2毗邻于Form1 例如 就像是 button click handler method Form2 child new Form2 child Location n
  • C# P2P聊天应用程序设计

    我想创建一个不使用显式服务器的简单聊天应用程序 主要要求是用户可以同时与许多朋友聊天 就像在 Skype 等上一样 我在这里指的不是会议聊天 而是多个单独的聊天窗口 目前 我只想要一个 LAN 消息应用程序 但如果设计能够轻松扩展到 Int
  • 基本 WinForm KeyDown 事件处理

    我正在使用 WinForms 我已经为KeyDown主窗体的事件 从而调用按钮的Click事件处理程序 The Click调用的事件处理程序取决于按下的特定键 如果用户单击该按钮而不是使用该键 然后随后尝试使用该键 则该键 例如向下箭头 将
  • 在 C# 中使用正则表达式重复模式

    我有一串话 词黑暗王辉光我们结束你好再见低翼 我需要找到第一个单词的最后一个字母与以下单词的第一个字母匹配的单词 例如 worD Dark 我写了一个正则表达式 b w w W 1 w b 目前它成功找到连续 2 个单词 Regex Mat
  • 关于使用 Botframework v4 更改为新 LUIS 密钥的问题

    我在 Azure 中下载了 C 模板 它会自动创建并设置 LUIS 应用程序 但现在 LUIS 达到 1000 次调用并且现已过期 我使用创建了一个新密钥本指南 https learn microsoft com en us azure c
  • C++ Microsoft:如何将 uuid/guid 与模板专业化相关联

    我想将 uuid guid 与模板专业化相关联 以下代码可用于将 uuid 与非模板接口 类 结构 关联 interface declspec uuid CECA446F 2BE6 4AAC A117 E395F27DF1F8 ITest
  • 有没有工具可以检测 Visual C++ 6.0 上的缓冲区溢出? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 由于堆问题 我一直遇到崩溃问题 所以我猜想某个地方发生了缓冲区溢出 我如何检测它 I use Compuware 边界检查器 http w
  • 关于捕获异常的良好实践

    我正在用 C 11 编写一个小程序 并且第一次真正使用异常 我有一个关于如何有效捕获异常的问题 经过一番谷歌搜索后我仍然没有答案 这是问题 通过 const 左值引用捕获异常还是通过 const 右值引用捕获异常 哪个更有效 或推荐 在代码
  • 在第 i 个位置切换一点[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中设置 清除和切换单个位 https stackoverflow com questions 47981 how do you set clear and toggle a single
  • 在c#中搜索支持rar格式的压缩库

    我想在我的应用程序中添加功能来解压缩 并可选择压缩 各种格式的文件 我有支持 zip gzip 7zip 和 bzip2 的库 但还是没有找到支持rar的库 我知道 rar 是商业的 但也许有一些 net 库可用于解压缩 rar s 最好是

随机推荐

  • 减去日历对象中的天数[重复]

    这个问题在这里已经有答案了 可能的重复 有人知道使用java日历减去X天的日期的简单方法吗 我需要给定日期 givenDate 减去 365 天 Calendar calendar Calendar getInstance calendar
  • 在使用 Scrapy 进行身份验证时抓取 LinkedIn

    所以我读过在 Scrapy 中使用经过身份验证的会话进行爬网我挂断了 我 99 确信我的解析代码是正确的 我只是不相信登录正在重定向并且成功 我也遇到了 check login response 的问题 不确定它正在检查哪个页面 尽管 退出
  • Mongodb 无法在 Ubuntu 15.04 中启动

    我使用以下命令在 Ubuntu 15 04 中安装了 MongoDB 3 0 6 sudo apt key adv keyserver hkp keyserver ubuntu com 80 recv 7F0CEB10 echo deb h
  • MySQL:多个字段的唯一约束[重复]

    这个问题在这里已经有答案了 我有两个表 gt 变量 id 名称 和 Variable Entries id var id 值 我希望每个变量都有一组唯一的条目 如果我使值条目唯一 那么不同的变量将无法具有相同的值 这是不正确的 有什么方法可
  • 组合多个 sed 命令[重复]

    这个问题在这里已经有答案了 有以下文件 tr class in th In th td 1 2 kB s 0 0 td td 8 3 kB s 0 0 td td 3 2 kB s 0 0 td tr tr class out th Out
  • 查找并删除类

    我有以下结构 li class instruction div class row1 title div div class row2 details hidden details div li 隐藏的CSS是 display none 我
  • 在 Meteor 中,如何以不同的名称发布一个服务器端 mongo 集合?

    我有一个名为 Profiles 的服务器端 mongo 集合 如果用户 adminId 我需要发布和订阅整个配置文件集合 这样管理员就可以编辑 更新等 每个配置文件集合项 但我希望用户能够看到他们的个人资料记录 所以我尝试了这个 客户端 M
  • 使用 keycloak userinfo 端点获取用户角色

    如何获取 keycloak 中 userinfo 端点的回复中包含的角色 我在 keycloak 中为用户定义了 角色映射 当我调用 userinfo 端点时 我得到电子邮件名称等字段 但角色不包含在回复中 当我调用 auth 端点时 我得
  • 如何在悬停而不是单击时使 Twitter Bootstrap 菜单下拉菜单

    我希望我的 Bootstrap 菜单在悬停时自动下拉 而不必单击菜单标题 我还想去掉菜单标题旁边的小箭头 要让菜单在悬停时自动下降 可以使用基本的 CSS 来实现 您需要制定隐藏菜单选项的选择器 然后将其设置为在适当的时候显示为块li标签悬
  • Python 的 super() 的 Fortran 模拟?

    在 Fortran 2003 8 中使用类 特别是使用扩展类型时 是否有 python 的 super 函数的类似功能 可用于从扩展类型中调用已在扩展类型中重写的方法 是的 如果父类型不是抽象的 CALL object ParentType
  • 使用 Ruby 或 Python 创建静态图形文件(png、gif、jpg)[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想根据用户输入动态创建一个图形图像 然后将该图像呈现为 PNG 文件 如果需要 可以使用 jpg 或 gif 但首选 PNG 这实际上是一个占星学应用程序 我想做的是生成 PN
  • 在 Windows 7 64 位中使用 32 位 shell 扩展

    我想开发一个与 Windows XP SP2 32 位 和 Windows 7 64 位兼容的 shell 扩展 上下文菜单处理程序 是否可以在 64 位 Windows 中运行 32 位 shell 扩展 或者必须将 shell 扩展移植
  • 多进程 C# 应用程序(例如 Google Chrome)的示例

    任何人都知道像 Google Chrome 这样的多进程 C 应用程序的好示例 感谢帮助 有用的博客文章 带有实际的 C 源代码 http wyday com blog 2010 multi process c sharp applicat
  • MySQL 将两列合并为一列

    我正在尝试找到一种将两列合并为一列的方法 但不断获取列中的值 0 而不是单词的组合 这些是我和其他人尝试过的 SELECT column1 column2 AS column3 FROM table SELECT column1 colum
  • 为什么 PHP 脚本在任何回显/输出之前等待“完成脚本”?

    考虑一个简单的脚本
  • - (CGRect)convertRect:(CGRect)rect toView:(UIView *)view 如何工作

    我一直断断续续地使用这种方法 但从未真正理解它们的行为方式 每次我尝试使用它们时 我都会发现自己在黑暗中摸索 因为我尝试了不同的方面 但它似乎从来没有达到我的预期 为了便于讨论 我正在尝试转换从 UIKeyboard 的通知中获得的框架 在
  • 什么时候调用 viewWillAppear、viewDidDisappear 等中的 super 方法...?

    In UIViewController 的文档 苹果建议在viewWillAppear viewDidAppear viewWillDisappear viewDidDisappear等的实现中的某个时刻调用super 例如关于viewDi
  • 有没有办法打破 pdb 内置的 print ?

    基本上 标题 我试图追踪大型代码库中发生虚假打印的位置 并且我想在打印 发生 时中断或以某种方式获取堆栈跟踪 有任何想法吗 对于这种特殊情况 您可以重定向stdout打印输出及其调用者的辅助类 您还可以突破它的其中一种方法 完整示例 imp
  • xcode 故事板不接受更改

    我的故事板似乎被锁定了 我已将新标签和图像视图添加到两个不同的场景 但在运行时标签和图片不显示 所有原始项目都正确显示 我尝试过清理 构建和构建运行 测试和分析 我已将整个项目复制到另一台 Mac 上 它运行程序 接受代码中的更改 但是这台
  • boost::asio::buffer:获取缓冲区大小并防止缓冲区溢出?

    我有以下两个用于发送和接收数据包的函数 void send std string protocol char request new char protocol size 1 request protocol size 0 memcpy r