Boost.Asio-其他特性

这章我们讲了解一些Boost.Asio不那么为人所知的特性。标准的stream和streambuf对象有时候会更难用一些,但正如你所见。它们也有它们的益处。最后,你会看到姗姗来迟的Boost.Asio协程的入口,它能够让你的异步代码变的很易读。这是很惊人的一个特性。


标准stream和标准I/O buffer
读这一章节之前你须要对STL stream和STL streambuf对象有所了解。
Boost.Asio在处理I/O操作时支持两种类型的buffer:
  • boost::asio::buffer():这样的buffer关联着一个Boost.Asio的操作(我们使用的buffer被传递给一个Boost.Asio的操作)
  • boost::asio::streambuf:这个buffer继承自std::streambuf,在网络编程中能够喝STL stream一起使用
纵观全书。之前的样例中最常见的样例例如以下:
  1. size_t read_complete(boost::system::error_code, size_t bytes){ ... }
    char buff[1024];
    read(sock, buffer(buff), read_complete);
    write(sock, buffer("echo\n"));
通常来说使用这个就能满足你的须要,假设你想要更复杂。你能够使用streambuf来实现。
这个就是你能够用streambuf对象做的最简单也是最坏的事情:

streambuf buf;

   read(sock, buf);
这个会一直读到streambuf对象满了。然后由于streambuf对象能够通过自己又一次开辟空间从而获取很多其它的空间,它基本会读到连接被关闭。
你能够使用read_until一直读到一个特定的字符串:

streambuf buf;

read_until(sock, buf, "\n");

这个样例会一直读到一个“\n”为止,把它加入到buffer的末尾,然后退出read方法。
向一个streambuf对象写一些东西,你须要做一些类似以下的事情:

streambuf buf;
std::ostream out(&buf);
out << "echo" << std::endl;
write(sock, buf);
这是很直观的;你在构造函数中传递你的streambuf对象来构建一个STL stream,将其写入到你想要发送的消息中,然后使用write来发送buffer的内容。

Boost.Asio和STL stream
Boost.Asio在集成STL stream和网络方面做了非常棒的工作。也就是说。假设你已经在使用STL扩展,你肯定就已经拥有了大量重载了操作符<<和>>的类。从socket读或者写入它们就好像在公园漫步一样简单。

如果你有以下的代码片段:
struct person {
std::string first_name, last_name;
int age;
   };
std::ostream& operator<<(std::ostream & out, const person & p) {
       return out << p.first_name << " " << p.last_name << " " << p.age;
}
std::istream& operator>>(std::istream & in, person & p) {
    return in >> p.first_name >> p.last_name >> p.age;

}

通过网络发送这个person就像以下的代码片段这么简单:
streambuf buf;
std::ostream out(&buf);
person p;
// … 初始化p
out << p << std::endl;
write(sock, buf);
另外一个部分也能够很easy的读取:
read_until(sock, buf, "\n");
std::istream in(&buf);
person p;
in >> p;
使用streambuf对象,当然,也包含它用来写入的std::ostream和用来读取的std::istream时最优秀的部分就是你终于的编码会非常自然:
  • 当通过网络写入一些要发送的东西时。非常有可能你会有多个片段的数据。所以,你须要把数据加入到一个buffer里面。假设那个数据不是一个字符串,你须要先把它转换成一个字符串。

    当使用<<操作符时这些操作默认都已经做了

  • 相同。在另外一个部分,当读取一个消息时,你须要解析它,也就是说。读取到一个片段的数据时,假设这个数据不是字符串,你须要将它转换为字符串。当你使用>>操作符读取一些东西时这些也是默认就做了的
最后要给出的是一个很著名,很酷的诀窍。使用以下的代码片段把streambuf的内容输出到console中
  1. streambuf buf;
    ...
    std::cout << &buf << std::endl; // 把全部内容输出到console中
相同的,使用以下的代码片段来把它的内容转换为一个string:
  1. std::string to_string(streambuf &buf) {
    std::ostringstream out;
    out << &buf;
    return out.str();

}


Boost.Asio c++ 网络编程翻译(26)的更多相关文章

  1. Boost.Asio c++ 网络编程翻译(20)

    异步服务端 这个图表是相当复杂的:从Boost.Asio出来你能够看到4个箭头指向on_accept.on_read,on_write和on_check_ping. 着也就意味着你永远不知道哪个异步调 ...

  2. Boost.Asio c++ 网络编程翻译(14)

    保持活动 假如,你须要做以下的操作: io_service service; ip::tcp::socket sock(service); char buff[512]; ... read(sock, ...

  3. Boost.Asio c++ 网络编程翻译(11)

    *_at方法 这些方法在一个流上面做随机存取操作.你来指定read和write操作从什么地方開始(offset): async_read_at(stream, offset, buffer [, co ...

  4. Boost.Asio c++ 网络编程翻译(21)

    同步VS异步 Boost.Asio的作者做了一个非常惊艳的工作:它能够让你在同步和异步中自由选择,从而更好的适应你的应用. 在之前的章节中,我们学习了每种类型应用的框架,比方同步client,同步服务 ...

  5. Boost.Asio c++ 网络编程翻译(16)

    TCP异步服务端 核心功能和同步服务端的功能类似,例如以下: class talk_to_client : public boost::enable_shared_from_this<talk_ ...

  6. Boost.Asio c++ 网络编程翻译(10)

    read/write方法 这些方法对一个流进行读写操作(能够是套接字,或者其它表现的像流的类): async_read(stream, buffer [, completion],handler):这 ...

  7. Boost.Asio c++ 网络编程翻译(18)

    同步服务端 同步服务端也相当简单.它须要两个线程,一个负责接收新的client.另外一个负责处理已经存在的client. 它不能使用单线程:等带一个新的client是一个堵塞操作,所以我们须要另外一个 ...

  8. JavaSE_ 网络编程 目录(26)

    JavaSE学习总结第26天_网络编程26.01 网络编程概述26.02 网络模型概述和图解26.03 网络编程三要素概述26.04 网络编程三要素之IP概述126.05 InetAddress类的概 ...

  9. boost.asio系列——socket编程

    asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程. 客户端 客户端的代码如下: #include &l ...

随机推荐

  1. (视频)《高速创建站点》 4.2 完结篇 – 应用运营vs.发射卫星,遥測(Telemetry) 技术

    本文是<高速创建站点>系列的第10篇(完结篇),假设你还没有看过之前的内容,建议你点击下面文件夹中的章节先阅读其它内容再回到本文.訪问本系列文件夹.请点击:http://anb.io/bl ...

  2. 《HBase权威指南》读书笔记----简介

    工作中要使用HBase,刚刚开始接触HBase,理解不深,只是记录一下 . HBase基于google的bigtable论文实现,属于nosql. 几个概念: (1)列(column):最基本单位为列 ...

  3. python常用类型的内置函数列表

    1.list.append(obj)         向列表中加入一个对象obj fruits = ['apple', 'pear', 'orange'] >>> fruits.ap ...

  4. [原创] linux deepin 2014.1下编译putty

    在网上找了很久,都没有找到linux下直接可以用的putty程序,最终在putty官网找到了源代码 点击下载 把源代码下载回来. 1.下载源代码 2.安装依赖库 如果系统中没有安装过libgtk2.0 ...

  5. [Windows Phone] 以多国语言做为开发前提 (2)

    原文:[Windows Phone] 以多国语言做为开发前提 (2) ? 前言 在先前的文章 [Windows Phone 开发 - 以多国语言做为开发前提 (1)] 中说明了简单的多国语言范例,今天 ...

  6. 【SICP读书笔记(二)】使用过程来黏合数据 —— 酷炫吊的消息传递机制

    首先,让我们来看几个内建函数 (cons x y),作用是把x和y绑定成一个序对 (car z),作用是提取z序对的第一个元素 (cdr z),作用是提取z序对的第二个元素 容易看出,这个东西有点类似 ...

  7. 15一个NoSql数据库

    随着因特网web2.0该网站的兴起.非关系型数据库,现在已经成为一个非常受欢迎的新领域.非关系数据库产品的发展非常迅速.而在处理传统的关系数据库web2.0现场.特别是大规模,高并发SNS类型web2 ...

  8. Directx11学习笔记【二十】 使用DirectX Tool Kit加载mesh

    本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/p/5788482.html 现在directx已经不再支持.x文件了, ...

  9. Android 学习历程摘要(二)

    1.资源文件命名仅仅能小写,否则会报错生成不了R.java文件 2.R文件导包时应该导入自己project的包,而不是android.R 3.数据库操作使用SqliteOpenHelper 4.val ...

  10. 截图工具 Snagit

    相对于其他截图工具方面,Snagit 一个主要特点是: 滚动截图. 另:同样基于手工绘制的形状截图, 有可能截取文本(测试只 windows在窗口内的目录 要么 文件名 实用). 不管是 web页,是 ...