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

本文介绍了Muduo网络库中TcpConnection类在处理客户端断开连接时的改进,包括Channel类新增closecallback事件回调、TcpConnection类采用shared_ptr管理以避免析构问题,以及TcpServer类注册closecallback来接收断开消息。详细分析了当客户端主动断开连接时的程序流程。
摘要由CSDN通过智能技术生成

源码下载以及安装点击链接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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值