boost:asio 联接管理2
boost::asio 连接管理2
从上一节的例子,可以得到一个推论,如果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,我还没学呢。哈哈。马上现学。