您的位置:首页 > 其它

boost::asio 连接管理4

2013-01-14 00:33 369 查看
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:1
count2:2
count3:2
The new connection object is starting now.
correct data received
~Connection

顺序正常了,析勾函数最后被调用。也收到了正确的数据。
这也就解释了为什么那么多asio的例子中都使用了shared_from_this().

现在我们到哪里了?
1.优雅的退出
2.单线程情况下的接受连接和管理连接对象的生命周期
我们知道了连接对象默认如果什么都不做就会被自动销毁。要想不被销毁就要一直发起I/O操作(读或者写),前面的推论已经证明了。

后面继续推进,我们要保证tcp连接被确定关闭,而且为了支持并发,需要线程池的支持。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: