源码下载以及安装点击链接https://blog.csdn.net/YoungSusie/article/details/90021742
本服务器只有一种方法可以断开连接:被动关闭,即对方先关闭连接,本地read返回 0 ,触发关闭逻辑。
1、Channel class 的改动
Channel class 新增了closecallback 事件回调,并且断言(assert ) 在事件处理期间本channel 对象不会析构。
此处需要说明一种情况:客户端断开TCP连接,这个事件会出发服务端 channel::handleRead() 调用,根据read() 返回0 调用closecallback() 函数来关闭连接。但是,在closecallback() 关闭连接的时候可能会析构channel 对象,这就造成了灾难,因为这个函数是有channel 对象来调用的,调用途中channel被析构了,导致core dump 。
解决办法是: 提供channel::tie(const boost::shared_ptr &) 函数,用来延长对象的生命期,使其长过channel::handleRead() 函数,这也是为什么TCPConnection 会采用shared_ptr 来管理的原因,否则的话channel::handleRead()有可能会析构TCPConnection对象,继而将当前channel 对象也析构了。
void Channel::handleEvent()
{
if(revents_ & POLLNVAL){
std::cout<< "Channel::handle_event fd is not open\n";}
if(revents_ & (POLLERR | POLLNVAL)){
if(errorCallback_) errorCallback_();}
if(revents_ & (POLLIN | POLLPRI | POLLRDHUP)){
if(readCallback_) readCallback_();}
if(revents_ & POLLOUT){
if