TcpConnection是muduo库里面最复杂的类。
其复杂性来自于TCP连接固有的复杂性,包括连接建立、连接断开、数据发送、数据接收。
后面的章节会针对这4个内容详细讲解。
1.类的结构
class TcpConnection
{
/*********************Function Member************************************/
//write and read
void send(Buffer* message);
void startRead();
void stopRead();
void handleRead(Timestamp receiveTime);
void handleWrite();
//set callbacks
void setConnectionCallback(const ConnectionCallback& cb)
void setMessageCallback(const MessageCallback& cb)
void setWriteCompleteCallback(const WriteCompleteCallback& cb)
void setHighWaterMarkCallback(const HighWaterMarkCallback& cb, size_t highWaterMark)
void setCloseCallback(const CloseCallback& cb)
//control connection establish and destroy
void connectEstablished();
void connectDestroyed();
void handleClose();
/**********************Data Member**************************************/
enum StateE { kDisconnected, kConnecting, kConnected, kDisconnecting };
//genearl
const string name;
StateE state;
//loop
EventLoop* loop;
boost::scoped_ptr<Socket> socket;
boost::scoped_ptr<Channel> channel;
ConnectionCallback connectionCallback;
MessageCallback messageCallback;
WriteCompleteCallback writeCompleteCallback;
HighWaterMarkCallback highWaterMarkCallback;
CloseCallback closeCallback;
//buffer
Buffer inputBuffer;
Buffer outputBuffer;
};
2.数据成员
(1)general
表示名字和状态
(2)loop
常用的loop、socket、channel什么的
然后就是一些channel的callback函数
(3)buffer
用于读写的数据结构
3.函数成员
(1)write and read
都要进行相应地判断。
比如发送,如果当前没有在发送并且发送缓冲区也是空的,就可以调用write函数直接发送。
如果发送缓冲区有数据,这将现在需要发送的数据放入发送缓冲区。
更详细的讲解后面会有。
(2)callbacks
这个没什么好说的,在TcpConnection建立之后会传进来各种callback
这里需要特别注意的就是为了防止发送数据速度大于对端接收缓冲区速度的应对办法
采用HighWaterMarkCallback
(3)connection establish and destroy
这个后面也会详细讲解。
复杂性就来自于本身回调过程的复杂以及本身connection断开的复杂