代码改变世界

Boost asio基本概念

2017-01-08 15:36  jiayayao  阅读(5458)  评论(0编辑  收藏  举报

  asio库基于操作系统提供的异步机制,采用前摄器模式(Proactor)实现可移植的异步(或同步)IO操作,不需要使用多线程和锁,有效避免多线程编程带来的诸多有害副作用(如竞争,死锁)。

  asio封装了操作系统的select、kqueue、poll/epoll、overlapped I/O等机制,实现异步IO模型。在同步模式下,程序发起一个IO操作,向io_service提交请求,io_service把操作转交给操作系统,同步地等待。当IO操作完成时,操作系统通知io_service,然后io_service再把结果发回给程序,完成整个同步流程。在异步模式下,程序除了要发起IO操作,还要定义一个用于回调的完成处理函数。io_service同样把IO操作转交给操作系统执行,但它不同步等待,而是立即返回。调用io_service的run()成员函数可以等待异步操作完成,当异步操作完成时io_service从操作系统获取结果,在调用handler执行后续逻辑。

1. handler

  回调函数形式:

void handler(const error_code &ec);
void handler(const error_code &ec, std::size_type bytes_transferred);

2. io_service

  io_service类代表了系统里的异步处理机制(如epoll),必须在asio库里的其他对象之前初始化,其他对象则向io_service提交异步操作handler。

3. const_buffer

  数据缓冲区,保存了一个void*的内存地址和数据长度。

4. 网络通信相关

  asio支持TCP、UDP和ICMP通信协议,很好的封装了伯克利socket api。其中TCP部分定义了一些用于TCP通信的typedef类型,包括端点类endpoint、套接字类socket、流类iostream,以及接收器acceptor、解析器resolver等。 

class tcp
{
public:
  /// The type of a TCP endpoint.
  typedef basic_endpoint<tcp> endpoint;
  /// The TCP socket type.
  typedef basic_stream_socket<tcp> socket;
  /// The TCP acceptor type.
  typedef basic_socket_acceptor<tcp> acceptor;
  /// The TCP resolver type.
  typedef basic_resolver<tcp> resolver;
  /// The TCP iostream type.
  typedef basic_socket_iostream<tcp> iostream;
  /// ......
};

  endpoint包含IP地址和通信用的端口号。

  socket可以在构造时指定使用的协议或者endpoint,或者稍后调用成员函数connect()。连接成功后可以用local_endpoint()和remote_endpoint()获得连接两端的端点信息,用available()获取可读取的字节数,用receive()/read_some()和send()/write_some()读写数据,当操作完成后使用close()函数关闭socket。如果socket没有被关闭,则其析构时也会自动关闭。

  acceptor对应Socket API的accept()函数,用于服务器端。acceptor可以像传统socket API一样使用,open()打开端口,bind()绑定再用listen()侦听端口,但更方便的是使用它的构造函数,传入endpoint直接完成这三个动作。

  实现例子:使用Boost asio实现同步的TCP/IP通信使用Boost asio实现异步的TCP/IP通信