boost::asio 连接管理1
在完成了第一个基于boost::asio的通信服务程序后,回顾一下所用到的概念,参考一些资料。将用一个系列来归纳一下如何通过boost::asio编写高性能TCP服务程序。
本篇从简单的单线程开始,描述如何监听端口,接收连接请求。同时也复用了前面的“优雅的退出” 的代码。
首先main函数创建一个server对象,server对象负责监听本地8888端口,一旦有连接请求,则创建一个connection对象,并调用StartWork开始工作。
下面是代码:
The new connection object is starting now.~Connection
这个关系到对象生命周期的问题。
先看Server的构造函数里面,创建了一个Connection对象,用shared_ptr管理,此时引用计数为1,然后在下面一句bind调用时,将c变量保存到bind_t中了,因此引用计数会增加到2, 之后构造函数结束,引用计数减到1.
asio回调bind_t对象的operator()() 的时候最终会调用到AfterAccept函数,c对象作为引用参数传递进来,因此参数传递没有增加引用计数。但是这中间的asio回调机制使得引用计数增加到2.
然后里面运行了StartWork,StartWork很快返回。当AfterAccept函数退出时,asio的回调机制的清理将引用计数减到1, 而bind_t这个function object对象也被销毁,因此引用计数降到0,所以c的析构函数被调用。
bind内部的细节不去管他,这里只要注意一旦StartWork函数退出,对象就会被销毁。
由于在AfterAccept函数最后总是又调用一次async_accept函数,所以会一直不断的等待新的连接。直到io_service::stop函数被调用,才结束整个程序。
这个简单的例子是一个开始,也说明了连接是如何建立的,连接对象的生命周期是如此脆弱。后面会继续改进。