Asio Line-Based Operations

2023-11-08

许多常用的internet协议是基于行的,这意味着他们具有由字符序列"\r\n"分隔的协议元素。这样的协议有HTTP、SMTP和FTP。为更容易实现基于行的协议以及其他使用分隔符的协议,Asio包括read_until()和async_read_until()函数。
以下例子说明了在HTTP服务器中使用async_read_until()用来接收来自客户端请求的第1行:

class http_connection
{
  ...

  void start()
  {
    asio::async_read_until(socket_, data_, "\r\n",
        boost::bind(&http_connection::handle_request_line, this, _1));
  }

  void handle_request_line(asio::error_code ec)
  {
    if (!ec)
    {
      std::string method, uri, version;
      char sp1, sp2, cr, lf;
      std::istream is(&data_);
      is.unsetf(std::ios_base::skipws);
      is >> method >> sp1 >> uri >> sp2 >> version >> cr >> lf;
      ...
    }
  }

  ...

  asio::ip::tcp::socket socket_;
  asio::streambuf data_;
};

streambuf数据成员用作存储从socket读取的在搜索到分隔符之前的数据。重要的是要记住在分隔符之后可能还有其他数据。这些多余的数据应该留在streambuf中,以便随后调用read_until()或async_read_until()来检查它。
分隔符可以被指定为单个字符、std::string或者boost::regex, read_until()和async_read_until()函数还包括接受用户定义的函数对象作为匹配条件的重载。例如读取数据到一个streambuf中直到遇见空格:

typedef asio::buffers_iterator<
    asio::streambuf::const_buffers_type> iterator;

std::pair<iterator, bool>
match_whitespace(iterator begin, iterator end)
{
  iterator i = begin;
  while (i != end)
    if (std::isspace(*i++))
      return std::make_pair(i, true);
  return std::make_pair(i, false);
}
...
asio::streambuf b;
asio::read_until(s, b, match_whitespace);

读取数据到一个streambuf中直到遇见匹配的字符:

class match_char
{
public:
  explicit match_char(char c) : c_(c) {}

  template <typename Iterator>
  std::pair<Iterator, bool> operator()(
      Iterator begin, Iterator end) const
  {
    Iterator i = begin;
    while (i != end)
      if (c_ == *i++)
        return std::make_pair(i, true);
    return std::make_pair(i, false);
  }

private:
  char c_;
};

namespace asio {
  template <> struct is_match_condition<match_char>
    : public boost::true_type {};
} // namespace asio
...
asio::streambuf b;
asio::read_until(s, b, match_char('a'));

is_match_condition<> 对于函数和具有嵌套result_type typedef的函数对象自动评估为true. 对于其他类型,必须显示特化,如上所示。

原文

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Asio Line-Based Operations 的相关文章

  • 系统异常重启检测-mcelog

    mcelog 是Linux 系统上用来检查硬件错误 特别是内存和CPU错误的工具 比如服务器隔一段时间莫名的重启一次 而message和syslog又检测不到有价值的信息 通常发生MCE报错的原因有如下 1 内存报错或者ECC问题 2 处理
  • 小程序抛出Unterminated string literal异常的处理

    Unterminated string literal的异常原因是因为JS编程中对var对象赋值时 字符串出现回车导致的 如下图所示 如何解决这个问题 如果不需要回车 那么用 的形式取消掉回车 或者手动退格键删除回车 如果需要回车那么在字符
  • 嗯,我们出了一套做爬虫必备的 JS 逆向课程

    阅读本文大概需要 4 分钟 爬虫是大数据时代不可或缺的数据获取手段 它是综合技术的应用体现 有取就有失 有攻就有防 开发者为了保护数据 不得已想出了很多办法来限制爬虫对数据的获取 WEB 网站的构成使得 JavaScript 成为了开发者阻
  • selenium java自动化测试_《Selenium3 Java 自动化测试实战》--测试环境搭建

    1 测试环境搭建 1 1 安装Java 1 1 1 下载地址 https www java com zh CN download windows 64bit jsp 1 1 2 配置环境变量 1 2 安装 IntelliJ IDEA 1 2
  • 二、进程管理(一)进程与线程

    目录 1 1 进程的概念 1 1 1 进程的作用和组织 1 1 2 进程的状态与转换 1 1 3 进程控制 1 1 4 进程的通信 1 2 线程的概念 1 2 1线程的概念 1 2 2用户级线程和内核级线程 1 2 3多线程模型 1 1 进
  • 树莓派can总线_CAN总线知识点荟萃

    CAN协议和标准规范有哪些 表1 CAN协议和标准 从 CAN 总线协议颁布以来 CAN 总线经过了 ISO11898 1 ISO11898 2 ISO11898 3 ISO11898 4 ISO11898 5 ISO11898 6 国际标

随机推荐

  • 第五章:(1)S7-200 SMART PLC的编程语言及编程元件

    编程语言 1 梯形图 LAD 2 功能块图 FBD 3 语句表 STL S7 200 SMART PLC的编程元件 常用分类 中文 英文 注释 例 输入继电器 I I0 0 输出继电器 Q Q0 0 使用时不能超过PLC所提供的最大外部接线
  • Not allowed to load local resource: file:///D:/xxx.jpg

    问题 Not allowed to load local resource file D xxx jpg 出现以上情况的原因是浏览器不允许访问本地路径 所以你需要配置一个虚拟的路径代替本地的路径 解决方法 思路 通过tomcat代理 在to
  • 常见提高并发量的方式

    1 避免锁表操作 2 缓存常用数据 3 Redis使用时 连接串参数设置
  • Logstash将日志产生时间替换@timestamp

    一 跟着官网学习一下date插件 日期过滤器用于从字段中解析日期 然后使用该日期或时间戳作为事件的logstash时间戳 例如 syslog事件通常具有这样的时间戳 Bash Apr 17 09 32 01 你可以使用日期格式MMM dd
  • 互信息

    互信息 Mutual Information 是信息论里一种有用的信息度量 它可以看成是一个随机变量中包含的关于另一个随机变量的信息量 或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性 设两个随机变量 X Y X Y
  • openwrt web界面添加 菜单选项

    一 添加一级菜单选项 例如下图probe菜单选项 1 在 usr lib lua luci controller admin目录下 创建probe lua文件 如下 module luci controller admin probe pa
  • 服务端Too many open files解决方案

    服务端Too many open files解决方案 转自 http zhumeng8337797 blog 163 com blog static 1007689142012428104618670 cat proc sys fs fil
  • MySQL技术neimu InnoDB存储引擎 学习笔记 第七章 事务

    事务可确保把数据库从一种一致状态转换为另一种一致状态 在事务提交时 可确保要么所有修改都被保存了 要么所有修改都不被保存 InnoDB引擎事务完全符合ACID特性 1 原子性 atomicity 指整个事务是不可分割的工作单位 2 一致性
  • 【Shell牛客刷题系列】SHELL9 统计每个单词出现的个数:一起学习sort排序命令和uniq去重命令

    该系列是基于牛客Shell题库 针对具体题目进行查漏补缺 学习相应的命令 刷题链接 牛客题霸 Shell篇 该系列文章都放到专栏下 专栏链接为 专栏 Linux 欢迎关注专栏 本文知识预告 首先学习了对文件内容进行排序的sort命令和去除文
  • 企业微信API&群机器人配置

    我们公司用的企业微信 会把相关开发或者运维拉到一个群里 然后配置上一个群机器人 这样的话就可以用企业微信API来配置群机器人接收消息 把一些日常的服务器或者日志告警发送到对应的群 以下介绍两种常用的消息发送类型 文本类型和文件类型 发送文本
  • VUE中如何将tiff图片显示在浏览器中

    VUE中如何将tiff图片显示在浏览器中 下载tiff js 在index中引入 mounted 调用方法 this loadImage static pictif tif methods loadImage filename var xh
  • 初学盲打,免费,免安装,高颜值的在线打字练习网站

    小时候不怎么接触电脑没有练习过打字 长大后深刻地意识到盲打对工作效率的提高 于是下决心学盲打 和大家一样 刚开始的时候四处搜寻办法 直到遇见了下面两个网站 免费免安装 高颜值 练习打字的网站 均无利益关系 1 Touch Typing On
  • 31.Kubernetes(十三)-----监控(部署k8s高可用集群)

    k8s高可用集群 一 pacemaker搭建k8s高可用 server5和server6 1 配置部署 2 浏览器访问 3 高可用 二 k8s集群部署 三个节点相同操作 server7 server8 server9 1 安装docker
  • IDEA报错:java: 程序包jakarta.persistence不存在

    使用 jakarta 就不行 改成 javax 就运行成功
  • springboot整合log,每天生成一个新的带时间log文件,不同级别不同的输出位置

    首先在resources文件夹下创建 logback spring xml 在logback配置文件中添加
  • Grounded Language-Image Pre-training

    论文笔记 Grounded Language Image Pre training 摘要 引言 方法 Grounded Language Image Pre training 统一 度量衡 Object detection as phras
  • Java 线程池

    今天准备详细介绍java并发包下的Executor 以及Java提供了很多灵活的且极其方便的线程池的创建 嗯 那就慢慢说 大家肯定都学过Socket JavaSe的时候写聊天程序 游戏的服务器 以及Android程序自己需要提供服务器的 都
  • js里面输入输出题

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 1 宏任务和微任务 函数引用和变量引用 作用域和作用域链 同样是作用域链 1 宏任务和微任务 console log 1 async function async1
  • 长按开关机功能实现(不需要代码的实现方式,外围芯片)

    需要外围芯片的啊 最近发现的芯片EC190708 触摸模拟按键IC 长按三秒开关机 这自己用个51写个程序也一样吧 就输出一个高电平 控制一个MOS管就可以了 STC8便宜的才几毛 不比这个划算嘛 反正只是单片机用 说实话 单买价格挺贵的
  • Asio Line-Based Operations

    许多常用的internet协议是基于行的 这意味着他们具有由字符序列 r n 分隔的协议元素 这样的协议有HTTP SMTP和FTP 为更容易实现基于行的协议以及其他使用分隔符的协议 Asio包括read until 和async read