`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())
{


1111

被折叠的 条评论
为什么被折叠?



