* Protocol(通信协议)

Protocol,是asio在网络编程方面最重要的一个concept。在第一章中的levelX类图中可以看到,所有提供网络相关功能的服务和I/O对象都需要Protocol来确定一些细节。

Protocol的约束摘要如下:

 class protocol
{
public:
/// Obtain an identifier for the type of the protocol.
int type() const; /// Obtain an identifier for the protocol.
int protocol() const; /// Obtain an identifier for the protocol family.
int family() const; typedef ... endpoint;
typedef ... socket;
};

符合Protocol约束的类需要提供type/protocol/family三个接口,分别返回协议类型/协议枚举/协议组枚举;还需要提供两个类型定义endpoint/socket,分别表示通信协议一方的地址/继承于asio::basic_socket的类型。

目前,asio中符合Protocol约束的类有:stream_protocol,datagram_protocol,raw_protocol,seq_packet_protocol;
      既符合Protocol约束,同时又符合InternetProtocol约束的类有:tcp(TCP协议),udp(UDP协议),icmp(ICMP协议)。

* InternetProtocol(网络通信协议)

InternetProtocol,是Protocol的约束超集,在Protocol约束的基础上添加了几个新的约束。

InternetProtocol的约束摘要如下:

 class InternetProtocol
{
public:
/// Construct to represent the IPv4 internet protocol.
static InternetProtocol v4(); /// Construct to represent the IPv6 internet protocol.
static InternetProtocol v6(); /// Obtain an identifier for the type of the protocol.
int type() const; /// Obtain an identifier for the protocol.
int protocol() const; /// Obtain an identifier for the protocol family.
int family() const; typedef ... endpoint;
typedef ... socket;
typedef ... resolver;
};

其中,type/protocol/family接口和endpoint/socket类型定义都是属于Protocol约束的部分,在此不再赘述。InternetProtocol相对于Protocol新增的约束有:v4/v6两个静态接口,分别返回IPv4/IPv6版本的网络通信协议对象;类型定义resolver,表示继承于basic_resolver的类型。

* ConstBuffer(不可变缓冲区),ConstBufferSequence(不可变缓冲区序列),MutableBuffer(可变缓冲区),MutableBufferSequence(可变缓冲区序列)

ConstBuffer和MutableBuffer是asio中各种组件通用的缓冲区适配器concept,在asio中以const_buffer和mutable_buffer两个类实现。

ConstBuffer和MutableBuffer的约束摘要如下:

 class ConstBuffer
{
private:
friend void const* boost::asio::detail::buffer_cast_helper(const ConstBuffer& b);
friend std::size_t boost::asio::detail::buffer_size_helper(const ConstBuffer& b);
}; class MutableBuffer
{
private:
friend void* boost::asio::detail::buffer_cast_helper(const MutableBuffer& b);
friend std::size_t boost::asio::detail::buffer_size_helper(const MutableBuffer& b);
};

只需能通过buffer_cast_helper和buffer_size_helper这两个自由函数获取缓冲区首地址指针和缓冲区长度即可。这两个concept没有什么扩展的必要,因此asio中并未显式地提及,在后文中我们直接以他们当前的实现const_buffer和mutable_buffer这两个类替代。

ConstBufferSequence和MutableBufferSequence是const_buffer和mutable_buffer的容器约束。它们的约束摘要如下:

 class ConstBufferSequence
{
public:
typedef const_buffer value_type;
typedef ... const_iterator; const_iterator begin() const;
const_iterator end() const;
}; class MutableBufferSequence
{
public:
typedef mutable_buffer value_type;
typedef ... const_iterator; const_iterator begin() const;
const_iterator end() const;
};

ConstBufferSequence和MutableBufferSequence只需提供begin/end两个接口,返回相应的迭代器即可。

asio中,提供了const_buffer_1和mutable_buffer_1两个类,可以方便地将单个的const_buffer和mutable_buffer封装为容器外观,使其符合ConstBufferSequence和MutableBufferSequence约束。

* Stream(流),AsyncReadStream(支持异步读操作的流),AsyncWriteStream(支持异步写操作的流),SyncReadStream(支持同步写操作的流),SyncWriteStream(支持同步写操作的流)

Stream,就是大家耳熟能详的“流”。AsyncReadStream,AsyncWriteStream,SyncReadStream,SyncWriteStream四种concept是Stream的子集,在流的基础上添加一些接口。

Stream的约束摘要如下:

 class Stream
{
public:
void close();
boost::system::error_code close(boost::system::error_code& ec);
};

Stream的约束非常简单,只需要两个用于关闭流的close接口。

AsyncReadStream的约束摘要如下:

 class AsyncReadStream
{
public:
template <typename MutableBufferSequence, typename ReadHandler>
void async_read_some(const MutableBufferSequence& buffers,
BOOST_ASIO_MOVE_ARG(ReadHandler) handler); void close();
boost::system::error_code close(boost::system::error_code& ec);
};

AsyncReadStream在Stream的基础上增加了一个异步读数据的接口async_read_some,第一个参数buffers是一个符合MutableBufferSequence约束的对象,第二个参数是异步操作的回调函数。

AsyncWriteStream的约束摘要如下:

 class AsyncWriteStream
{
public:
template <typename ConstBufferSequence, typename WriteHandler>
void async_write_some(const ConstBufferSequence& buffers,
BOOST_ASIO_MOVE_ARG(WriteHandler) handler); void close();
boost::system::error_code close(boost::system::error_code& ec);
};

AsyncWriteStream在Stream的基础上增加了一个异步写数据的接口async_write_some,第一个参数buffers是一个符合ConstBufferSequence约束的对象,第二个参数是异步操作的回调函数。

SyncReadStream的约束摘要如下:

 class SyncReadStream
{
public:
template <typename MutableBufferSequence>
void read_some(const MutableBufferSequence& buffers); template <typename MutableBufferSequence>
boost::system::error_code read_some(const MutableBufferSequence& buffers, boost::system::error_code& ec); void close();
boost::system::error_code close(boost::system::error_code& ec);
};

SyncReadStream在Stream的基础上增加了一个异步读数据的接口read_some,第一个参数buffers是一个符合MutableBufferSequence约束的对象。

SyncWriteStream的约束摘要如下:

 class SyncWriteStream
{
public:
template <typename ConstBufferSequence>
void write_some(const ConstBufferSequence& buffers); template <typename ConstBufferSequence>
boost::system::error_code write_some(const ConstBufferSequence& buffers, boost::system::error_code& ec); void close();
boost::system::error_code close(boost::system::error_code& ec);
};

SyncWriteStream在Stream的基础上增加了一个同步写数据的接口write_some,第一个参数buffers是一个符合ConstBufferSequence约束的对象。

由于本文会实时根据读者反馈的宝贵意见更新,为防其他读者看到过时的文章,因此本系列专题谢绝转载!

boost.asio源码剖析(四) ---- asio中的泛型概念(concepts)的更多相关文章

  1. boost.asio源码剖析(一) ---- 前 言

    * 前言 源码之前,了无秘密.                                                       ——侯捷 Boost库是一个可移植.提供源代码的C++库,作 ...

  2. boost.asio源码剖析(三) ---- 流程分析

    * 常见流程分析之一(Tcp异步连接) 我们用一个简单的demo分析Tcp异步连接的流程: #include <iostream> #include <boost/asio.hpp& ...

  3. Django Rest Framework源码剖析(四)-----API版本

    一.简介 在我们给外部提供的API中,可会存在多个版本,不同的版本可能对应的功能不同,所以这时候版本使用就显得尤为重要,django rest framework也为我们提供了多种版本使用方法. 二. ...

  4. boost.asio源码剖析(五) ---- 泛型与面向对象的完美结合

    有人说C++是带类的C:有人说C++是面向对象编程语言:有人说C++是面向过程与面向对象结合的语言.类似的评论网上有很多,虽然正确,却片面,是断章取义之言. C++是实践的产物,C++并没有为了成为某 ...

  5. boost.asio源码剖析

    一. 前 言二. 架构浅析三. 流程分析     * 常见流程分析之一(Tcp异步连接)      * 常见流程分析之二(Tcp异步接受连接)      * 常见流程分析之三(Tcp异步读写数据)   ...

  6. boost.asio源码剖析(二) ---- 架构浅析

    * 架构浅析 先来看一下asio的0层的组件图.                     (图1.0) io_object是I/O对象的集合,其中包含大家所熟悉的socket.deadline_tim ...

  7. boost.compressed_pair源码剖析

    意义 当compressed_pair的某一个模板参数为一个空类的时候将对其进行“空基类优化”,这样可以使得compressed_pair占用的空间比std::pair的更小. 参考如下代码: #in ...

  8. jdk源码剖析四:JDK1.7升级1.8 HashMap原理的变化

    一.hashMap数据结构 如上图所示,JDK7之前hashmap又叫散列链表:基于一个数组以及多个链表的实现,hash值冲突的时候,就将对应节点以链表的形式存储. JDK8中,当同一个hash值(T ...

  9. ReactiveCocoa源码解析(四) Signal中的静态属性静态方法以及面向协议扩展

    上篇博客我们聊了Signal的几种状态.Signal与Observer的关联方式以及Signal是如何向关联的Observer发送事件的.本篇博客继续上篇博客的内容,来聊一下Signal类中静态的ne ...

随机推荐

  1. 【重读】The C++ Programming Language/C++编程语言(一)

    最近在写C++系列的文章,翻出以前看过的 C++之父Bjarne Stroustrup的书.再一次,竟然又有新的领悟.现在看来,这不是一本只讲C++的书,对于程序设计/开发,以及如何学习开发知识都有所 ...

  2. GRIDVIEW传值的两种方法

    第一种方法:在onselectedindexchanged中写事件 第二种方法:OnRowCommand事件 前端页面: <%@ Page Language="C#" Aut ...

  3. 【转】What's the difference between simulation and emulation

    摘要:这2个单词 还是用英文解释,比较准确.按我的理解:simulation就是模拟,可以做些改变. emulation是仿真,是按照原来的样子进行部署,不可以改变. Yes, the concept ...

  4. ios开发APP必须要了解的基本配置

    1,配置开发版本 AdHoc开发版,AppStore正式版 2,oc的宏转swift //常量=>ObjectC宏 letLoadingTip="加载中..." letiOS ...

  5. Typecho集成ueditor笔记

    前言:萝卜青菜各有所爱,因为个人需求所以需要在博客中集成ueditor,并非是我不喜欢md语法 其实本篇的笔记的书写最早也是在本地的md编辑器上完成的 1. 首先下载ueditor编辑器,然后重命名文 ...

  6. 利用BlazeDS的AMF3数据封装与Flash 进行Socket通讯

    前几天看到了Adobe有个开源项目BlazeDS,里面提供了Java封装AMF3格式的方法.这个项目貌似主要是利用Flex来Remoting的,不过我们可以利用他来与Flash中的Socket通讯. ...

  7. [POJ] #1007# DNA Sorting : 桶排序

    一. 题目 DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 95052   Accepted: 382 ...

  8. 总结调用Flash的几种方法

    一.Adobe 提供的方法 <object width="200" height="200" classid="clsid:D27CDB6E-A ...

  9. openjdk sunjdk区别

    使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的openjdk,那么到底什么是openjdk,它与sun jdk有什么关系和区别呢? 历史上的 ...

  10. MYSQL数据库性能调优之五:解决慢查询--存储引擎与数据类型

    3.数据类型的影响 4.存储引擎的影响 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mysql> show var ...