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,我还没学呢。哈哈。马上现学。