Basic Boost.Asio Anatomy(基本asio剖析)

在使用asio之前最好对它的一系列部件有个概念性的认识。
作为一个列子,我们先考虑当你对一个socket做connect操作时发生什么,我们先考虑同步操作。

你的程序将至少有一个io_service对象,io_service代表你的程序和操作系统的I/O服务之间的一个连接。
     boost::asio::io_service io_service;
为了执行I/O操作你的程序需要一个I/O对象,比如一个TCP socket。
     boost::asio::ip::tcp::socket socket(io_service);
当执行同步connect操作时,将发生下列事件:
     1、你的程序通过调用I/O对象的成员函数来初始化一个连接操作
          socket.connect(server_endpoint);
     2、I/O对象向io_service转发请求
     3、io_service请求操作系统来执行连接操作
     4、操作系统向io_service返回它的操作结果
     5、io_service把任何返回的错误转换成boost::system::error_code类型的对象,一个error_code可以用来和一个值进行比较,或者用作一个bool值(false意味着没有发生错误)。然后结果又被转发回I/O对象
     6、如果操作失败,I/O对象抛出一个boost::system::system_error类型的异常。如果初始化connect是使用的是下面的代码:
          boost::system::error_code ec;
          socket.connect(server_endpoint, ec);
     那么,ec就被设置成操作的返回结果,并且不会抛出异常
当使用异步操作时,下面的一系列事件将会发生:

     1、你的程序调用如下代码初始化一个连接操作:
          socket.async_connect(server_endpoint, your_completion_handler);
          这里的your_completion_handler是一个带有如下形式的函数或函数对象:
          void your_completion_handler(const boost::system::error_code &ec);
     2、I/O对象将请求转发给io_service
     3、io_service告诉操作系统要开始一个异步连接。
          时间流逝()
          
     4、操作系统把结果放入一个队列(它已准备好被io_service接受)来指示一个connect操作已被完成。
     5、你的程序必须要调用io_service::run()(或者一个类似功能的io_service成员函数)才能获取结果。当有未完成的异步操作时
对io_service::run()的调用会阻塞,所以通常你开始第一个异步操作时就应该立马调用它。
     6、在调用io_service::run()时,io_service从操作结果的队列中出队,把该结果转换成error_code,然后将该ec传递给your_completion_handler。
这是一个关于Boost.Asio如何运作的一个概览。你可以阅读文档继续深入。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值