boost::asio 连接管理4
来源:互联网 发布:声音改变软件 编辑:程序博客网 时间:2024/05/22 03:11
this指针不能在这种情况下绑定后交给asio使用。那么怎么办?
很简单,我之前的一篇文章介绍过enable_share_from_this。
http://blog.csdn.net/sheismylife/article/details/8282518
现在修改一下Connection类的代码:
class Connection: public boost::enable_shared_from_this<Connection> {public: Connection(io_service& s) : socket(s), read_buffer_(1, 0) { } ~Connection() { socket.close(); cout << "~Connection" << endl; } void StartWork() { cout << "The new connection object is starting now." << endl; async_read(socket, buffer(read_buffer_), boost::bind(&Connection::AfterReadChar, shared_from_this(), _1)); } void AfterReadChar(error_code const& ec) { if (ec) { cout << ec.message() << endl; return; } char x = read_buffer_[0]; if (x == 'a') { cout << "correct data received" << endl; } else { cout << "wrong data received, char is:" << (int)x << endl; } } public: tcp::socket socket; private: vector<char> read_buffer_;};
从enable_shared_from_this模板类继承,然后绑定的时候使用shared_from_this()
好了。再运行测试程序,看看服务器的输出:
chenshu@chenshu-beijing:~/NetBeansProjects/CppApplication_4/dist/Debug/GNU-Linux-x86$ ./cppapplication_4 count1:1count2:2count3:2The new connection object is starting now.correct data received~Connection
顺序正常了,析勾函数最后被调用。也收到了正确的数据。
这也就解释了为什么那么多asio的例子中都使用了shared_from_this().
现在我们到哪里了?
1.优雅的退出
2.单线程情况下的接受连接和管理连接对象的生命周期
我们知道了连接对象默认如果什么都不做就会被自动销毁。要想不被销毁就要一直发起I/O操作(读或者写),前面的推论已经证明了。
后面继续推进,我们要保证tcp连接被确定关闭,而且为了支持并发,需要线程池的支持。
- boost::asio 连接管理4
- boost::asio 连接管理1
- boost::asio 连接管理2
- boost::asio 连接管理3
- boost::asio 连接管理5
- boost::asio 连接管理6
- boost::asio 连接管理7
- boost::asio 连接管理8
- boost::asio 连接管理9
- boost::asio 连接管理10
- boost::asio 连接管理8
- boost::asio 连接管理11 如何关闭连接
- boost::asio设置同步连接超时
- boost::asio设置同步连接超时
- boost asio库 同步socket连接示例
- Boost Asio
- boost asio
- Boost.asio
- mac os x中android无法连接手机的解决方案
- 《Linux 八》 文件系统管理
- baodao
- 《Linux 九》Shell 讲解
- ACE程序演示 ACE中网络通讯编程基本架构
- boost::asio 连接管理4
- css中position:relative和overflow:hidden的问题
- 《Linux 十》 网络设置
- Vc串口通信(1)
- 《Linux 11》 文件共享服务器(了解) [用户管理(略)]
- 多字节字符与Unicode互转,JavaScript实现
- VC串口通信(3)
- 使用 libZPlay 播放音乐文件
- 《第七章》 数据管理 --之 动态内存分配