minimuduo库04——TcpConnection

本文深入探讨了TCP连接管理的核心概念,包括如何利用应用层缓冲区进行数据读写,确保数据的安全传输。详细解析了handleRead和handleWrite函数的工作原理,以及在数据发送过程中的错误处理和半发送情况下的应对策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TcpConnection

这个类就是用来帮助我们管理连接的。

在最开始之前,仅仅凭照之前的一些使用经验,想想需要哪些东西。

  1. connfd。这个会被我们抽象成一个Handler。
  2. 应用层缓冲区。为什么需要应用层缓冲区?——请查看muduo手册《Muduo Manual》中关于应用层缓冲区的设定。
  3. 收和接

我们希望当connHandler就绪的时候,自动去回调我们设置给它的回调函数——handleRead

handleRead

Buffer需要帮我们干了什么?

当connHandler就绪的时候,我们的网络库,也就是Buffer需要将数据从内核缓冲区安全地读出来。(这个安全即不会漏读,多读和错读)
这时根据read之后的返回值,去回调对应的回调函数。

handleRead(connfd)
{
	int n = buffer.readFd(connfd);
	if(n > 0)
	{
		messageCallback(...);
	}
	else{
		closeCallback(...);
	}
}

如果n > 0。回调我们的messageCallback。这是通过用户自己编写的,TcpServer->setMessageCallback,再去调用TcpConnection->setMessageCallback。我们在用户自己编写的messageCallback中。将数据从buffer中读取出来。然后处理。然后将数据需要重新发回到应用层发送缓冲区中。因此这里涉及TcpConnection->send的设计。之后谈。

如果n <= 0。代表出错,或者对端断开连接。我们这里当前统一的以断开连接去处理。此时需要我们去回调closeCallback。此时涉及连接的断开。这里也是一个大重点,后面会重新拿出来一篇文章来谈。

send

当我们调用send的时候,我们希望我们所在的应用层可以不去care网络层是否将数据发送完毕。我们只需要将数据发送到应用层缓冲区即可。至于底层,希望它可以自己处理好。

以上实际上是应用层缓冲区设计的核心思想。即我们仅仅只和应用层之间的数据打交道。而不再关心网络层或者内核缓冲区中的数据。

send的伪代码

TcpConnection::send(char *data, int size)
{
	// step1: 尝试直接发送
	int n = write(connfd, data, size);
	// 如果n == size 则代表我们全部发送内核缓冲区中。完成了任务
	// 如果n < size 则代表我们有 size - n 的数据没有发送到内核缓冲区中。(不管什么原因)
	if(n < 0)
		handlerError();
	if(n < size)
	{	// 将剩余数据存放到应用层缓冲区中
		char *tmp = data + n;
		outputBuffer.append(tmp, size - data);
		// 然后向reactor注册一个写事件
		handler->setWriteCallback(handleWrite);
		handler->enableWrite();
		reactor->update(handler);
	}
}

handleWrite

handleWrite里面的逻辑很简单,就是将应用层写缓冲区的数据取出来,发送到内核写缓冲区中去。如果取完了,就在reactor中取消关注写事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值