Muduo网络库的实现TcpConnction改进(八)

源码下载以及安装点击链接https://blog.csdn.net/YoungSusie/article/details/90021742

分类 Muduo网络库编程 学习笔记

本服务器只有一种方法可以断开连接:被动关闭,即对方先关闭连接,本地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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值