本文最后更新于:9 个月前
Muduo库源码剖析(2) 其余主要类
写在前面
上一篇分析了Muduo库依托的Reactor模式的三大核心类,今天继续剖析其余的主要类的源码!
正文
1 Acceptor类
1.1 Acceptor类简介
Accetpor封装了服务器监听套接字fd以及相关处理方法。Acceptor类内部其实没有贡献什么核心的处理函数,主要是对其他类的方法调用进行封装。
1.2 Acceptor类私有变量和方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| private: void handleRead();
EventLoop* loop_;
Socket acceptSocket_;
Channel acceptChannel_;
NewConnectionCallback newConnectionCallback_;
bool listenning_; int idleFd_;
|
1.3 Acceptor类公有方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public: typedef std::function<void (int sockfd, const InetAddress&)> NewConnectionCallback;
Acceptor(EventLoop* loop, const InetAddress& listenAddr, bool reuseport); ~Acceptor();
void setNewConnectionCallback(const NewConnectionCallback& cb) { newConnectionCallback_ = cb; }
bool listenning() const { return listenning_; }
void listen();
|
2 Socket类
2.1 Socket类简介
封装Sockets描述符,负责关闭连接。
2.2 Socket类变量和方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public: explicit Socket(int sockfd) : sockfd_(sockfd) { }
~Socket();
int fd() const { return sockfd_; } bool getTcpInfo(struct tcp_info*) const; bool getTcpInfoString(char* buf, int len) const;
void bindAddress(const InetAddress& localaddr); void listen(); int accept(InetAddress* peeraddr); void shutdownWrite();
void setTcpNoDelay(bool on); void setReuseAddr(bool on); void setReusePort(bool on); void setKeepAlive(bool on);
private: const int sockfd_;
|
3 Buffer类
3.1 Buffer类简介
Buffer类其实是封装了一个用户缓冲区,以及向这个缓冲区写数据读数据等一系列控制方法。
3.2 Buffer类成员方法
由于Buffer类代码较长,这里将比较核心的几个方法解释一下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| void append(const char* data, size_t len) { ensureWritableBytes(len); std::copy(data, data+len, beginWrite()); hasWritten(len); }
string retrieveAsString(size_t len) { assert(len <= readableBytes()); string result(peek(), len); retrieve(len); return result; }
string retrieveAllAsString() { return retrieveAsString(readableBytes()); }
void ensureWritableBytes(size_t len) { if (writableBytes() < len) { makeSpace(len); } assert(writableBytes() >= len); }
|
4 TcpConnection类
4.1 TcpConnection类简介
这个类主要封装了一个已建立的TCP连接,以及控制该TCP连接的方法(连接建立和关闭和销毁),以及该连接发生的各种事件(读/写/错误/连接)对应的处理函数,以及这个TCP连接的服务端和客户端的套接字地址信息等。
我个人觉得TcpConnection类和Acceptor类是兄弟关系,Acceptor用于main EventLoop中,对服务器监听套接字fd及其相关方法进行封装(监听、接受连接、分发连接给SubEventLoop等),TcpConnection用于SubEventLoop中,对连接套接字fd及其相关方法进行封装(读消息事件、发送消息事件、连接关闭事件、错误事件等)。
4.2 TcpConnection类核心成员变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
EventLoop* loop_;
const string name_;
StateE state_; bool reading_;
std::unique_ptr<Socket> socket_;
std::unique_ptr<Channel> channel_;
const InetAddress localAddr_; const InetAddress peerAddr_;
ConnectionCallback connectionCallback_; MessageCallback messageCallback_; WriteCompleteCallback writeCompleteCallback_; HighWaterMarkCallback highWaterMarkCallback_; CloseCallback closeCallback_;
size_t highWaterMark_;
Buffer inputBuffer_;
Buffer outputBuffer_;
boost::any context_;
|
4.3 TcpConnection类核心成员方法(私有)
1 2 3 4 5 6 7 8 9 10
|
void handleRead(Timestamp receiveTime);
void handleWrite();
void handleClose();
void handleError();
|
写在后面
这一篇介绍了其余几个主要类的功能,由于篇幅有限所以没能展开详述,自己目前对于架构梳理还是有些许不理解的地方,还要再仔细研究一下源码。后面打算通过一些应用Muduo的例子入手去学习一下。