首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

boost:asio 联接管理2

2013-01-19 
boost::asio 连接管理2从上一节的例子,可以得到一个推论,如果Connection对象中不再发起任何异步I/O操作,那

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






热点排行