Boost.Asio c++ 网络编程翻译(29)
- 如果调试失败,你需要看Boost.Asio能帮到你什么
- 如果你需要处理SSL,看Boost.Asio能帮你多少
- 如果你指定一个操作系统,看Boost.Asio为你准备了哪些额外的特性
- Asio被定义在asio::的命名空间中,而Boost.Asio被定义在boost::asio::中
- Asio的主头文件是asio.hpp,而Boost.Asio的头文件是boost/asio.hpp
- Asio也有一个启动线程的类(和boost::thread一样)
- Asio提供它自己的错误码类(asio::error_code代替boost::system::error_code,然后asio:system_error代替boost::systrem::system_error)
- Asio的新版本比Boost.Asio的新版本发布要早(因为Boost的版本更新比较少)
- Asio只有头文件(而Boost.Asio的部分依赖于其他Boost库,这些库可能需要编译)
- Asio和Boost.Asio都是非常成熟的,所以除非你非常需要一些Asio新发布的特性,Boost.Asio是非常保险的选择,而且你也可以同时拥有其他Boost库的资源
- >n:这个在我们进入handler n的时候使用。description实力包含了我们发送给handler的参数。
- <n:这个在我们退出handler n的时候使用。
- !n:这个当我们因为异常退出handler n的时候使用。
- -n:这个当handler n在没有调用的情况就退出的时候使用;可能是因为io_service实例被删除地太快了(在n有机会被调用之前)
- n*m:这个当handler n创建了一个新的有完成处理hanlder m的异步操作时被调用。description实例展示的就是异步操作开始的地方。当你看到>m(开始)和<m(结束)时completion句柄被调用了。
- n:就像在description中展示的一样,这个当handler n做了一个操作的时候使用(可能是close或者cancel操作)。你一般可以忽略这些信息。
- 当n是0时,操作是在所有(异步)handler之外被执行的;你经常会在第一个操作时看到这个,或者当你使用信号量的其中一个被触发时。
- 你需要非常注意类型为!n和-n的信息,这些信息大部分都意味着你的代码有错误。在第一种情形中,异步方法没有抛出异常,所以,异常一定是你自己造成的;你不能让异常跑出你的completion句柄。第二种情形中,你可能太早就销毁了io_service实例,在所有完成处理句被调用之前。
-
#define BOOST_ASIO_ENABLE_HANDLER_TRACKING #include <boost/asio.hpp> ...
@asio|1355603116.602867|0*1|[email protected]_connect
@asio|1355603116.604867|>1|ec=system:0
@asio|1355603116.604867|1*2|[email protected]_send
@asio|1355603116.604867|<1|
@asio|1355603116.604867|>2|ec=system:0,bytes_transferred=11
@asio|1355603116.604867|2*3|[email protected]_receive
@asio|1355603116.604867|<2|
@asio|1355603116.605867|>3|ec=system:0,bytes_transferred=9
@asio|1355603116.605867|3*4|[email protected]
@asio|1355603116.605867|<3|
@asio|1355603116.605867|>4|
John logged in
@asio|1355603116.606867|4*5|[email protected]
@asio|1355603116.606867|<4|
@asio|1355603116.606867|>5|
@asio|1355603116.606867|5*6|[email protected]_send
@asio|1355603116.606867|<5|
@asio|1355603116.606867|>6|ec=system:0,bytes_transferred=12
@asio|1355603116.606867|6*7|[email protected]_receive
@asio|1355603116.606867|<6|
@asio|1355603116.606867|>7|ec=system:0,bytes_transferred=14
@asio|1355603116.606867|7*8|[email protected]
@asio|1355603116.607867|<7|
@asio|1355603116.607867|>8|
John, new client list: John
- 句柄1被调用(当成功连接到服务端时)
- 句柄1调用async_send,这创建了句柄2(这里,我们发送登录信息到服务端)
- 句柄1退出
- 句柄2被调用,11个字节被发送出去(login John)
- 句柄2调用async_receive,这创建了句柄3(我们等待服务端返回登录的结果)
- 句柄2退出
- 句柄3被调用,我们收到了9个字节(login ok)
- 句柄3调用on_answer_from_server(这创建了句柄4)
- 句柄3退出
- 句柄4被调用,这会输出John logged in
- 句柄4调用了另外一个step(句柄5),这写ask_clients
- 句柄4退出
- 句柄5进入
- 句柄5,async_send_ask_clients,创建句柄6
- 句柄5退出
- 句柄6调用async_receive,这创建了句柄7(我们等待服务端发送给我们已存在的客户端列表)
- 句柄6退出
- 句柄7被调用,我们接受到了客户端列表
- 句柄7调用on_answer_from_server(这创建了句柄8)
- 句柄7退出
- 句柄8进去,然后输出客户端列表(on_clients)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。