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,我还没学呢。哈哈。马上现学。
我需要证明这个推论。如果连接建立后,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,我还没学呢。哈哈。马上现学。
相关文章推荐
- boost::asio 连接管理10
- boost::asio 连接管理11 如何关闭连接
- boost::asio 连接管理6
- boost::asio 连接管理9
- boost::asio 连接管理8
- boost::asio 连接管理1
- boost::asio 连接管理3
- boost::asio 连接管理4
- boost::asio 连接管理7
- boost::asio 连接管理8
- boost::asio 连接管理11 如何关闭连接
- boost::asio 连接管理5
- boost用asio设计TCP服务器中单连接的设计
- boost::asio 无法接受新连接的处理方法
- boost::asio设置同步连接超时
- 使用 boost::signals2 的智能连接管理
- Boos::asio服务器开发之连接管理
- boost asio 应用方法学——对象生命期管理
- boost::asio::ip::tcp::socket is connected?(如何知道socket已经连接?)
- boost::asio设置同步连接超时