读书人

boost:asio 联接管理1

发布时间: 2013-01-20 10:22:41 作者: rapoo

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函数被调用,才结束整个程序。

这个简单的例子是一个开始,也说明了连接是如何建立的,连接对象的生命周期是如此脆弱。后面会继续改进。






读书人网 >操作系统

热点推荐