[TcpConnection]

`TcpConnection`类是muduo最核心的类,这个类主要封装了一个已建立的TCP连接,以及控制该TCP连接的方法(连接建立和关闭和销毁),以及该连接发生的各种事件(读/写/错误/连接)对应的处理函数,以及这个TCP连接的服务端和客户端的套接字地址信息等。
 

成员变量

private:
	
	EventLoop*loop_;    //这里绝对不是Mainloop,因为tcpconnection都是在subloop里边管理的
	const string name_;
	atomic<int> state_;
	bool reading;
	
	unique_ptr<Socket> socket_;
	unique_ptr<Channle> channel_;
	
	const InetAddress localAddr_;
	const InetAddress peerAddr_;
	
	ConnectionCallback connectionCallback_;       // 有新连接回调                void(const TcpConnectionPtr&)
    MessageCallback messageCallback_;             //有读写消息回调   void(constTcpConnectionPtr&,Buffer*,Timestamp)
    WriteCompleteCallback writeCompleteCallback_  // 消息发送完成以后的回调       void(const TcpConnectionPtr&)
    CloseCallback closeCallbacl_;                 //void(const TcpConnectionPtr&)
    HighWaterMarkCallback highWaterMarkCallback_; //void(const TcpConnectionPtr&,size_t)
    size_t highWaterMark_;
    
	Buffer inputBuffer_;                          //接受缓冲区
    Buffer outputBuffer_;                         //发送缓冲区

	enum StateE{kDisconnected,kConnecting,kConnected,kDisconnecting}; 
  •  `loop_`该`Tcp`连接的Channel注册到了哪一个sub EventLoop上。这个loop_就是那一个sub EventLoop。
  • `highWaterMark_` 因为发送数据,应用写得快,内核发送数据慢,需要把待发送的数据写入缓冲区,且设置了水位回调,防止发送太快
  • `inputBuffer_  outputBuffer_`  输入输出缓冲区,在输出缓冲区是用于暂存那些暂时发送不出去的待发送数据。因为`Tcp`发送缓冲区是有大小限制的,假如达到了高水位线,就没办法把发送的数据通过send()直接拷贝到`Tcp`发送缓冲区,而是暂存在这个`outputBuffer_`中,等TCP发送缓冲区有空间了,触发可写事件了,再把`outputBuffer_`中的数据拷贝到`Tcp`发送缓冲区中。

重要成员函数

void TcpConnection::send(const std::string &buf) //直接引用buffer
{
    if(state_ == kConnected)
    {
        if(loop_->isInLoopThread())
        {
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值