您的位置:首页 > 其它

boost::asio 连接管理2

2013-01-13 19:31 411 查看
从上一节的例子,可以得到一个推论,如果Connection对象中不再发起任何异步I/O操作,那么当最后一个回调函数执行完后,Connection对象将被销毁。
我需要证明这个推论。如果连接建立后,StartWork发起一个异步调用等待数据,而在等待期间,Connection对象应该不会被销毁。
一旦等待的数据到了,如果没有后续的io操作(write or read)的话,Connection对象就会被销毁。因为boost::asio内部会将shared_ptr的引用计数降到0.
现在修改一下上一节的Connection代码:
class 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, 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_;
};
说明:
1.用vector<char>来保存读取的数据, 构造函数将其初始化为只包含一个字节的数组
2.async_read发起了异步调用,回调函数是成员函数AfterReadChar,该函数将判断读取的数据是否为a,并且打印相关信息。
3.if (ec) 语句是判断有无错误

我们还需要一个测试程序来发起TCP连接,并发送一个字节数据。
下一节将采用newLips编写测试程序。因为我不想再用Java写一堆测试了,至于newLisp,我还没学呢。哈哈。马上现学。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: