这是我参与「第四届青训营 」笔记创作活动的的第8天
网络库之:Accept类的设计和实现
Accept类的作用?
accept类的作用就是将socket连接的几个api进行了封装,并且同EventLoop进行了融合,更加符合事件驱动的一个模式其中封装了包括:
make socket,bind,listen,accept
相关类的介绍
InetAddress:
- 本类能够对于
struct sockaddr_int进行了简单的封装,能够自动的转换字节顺序EPOLLER
- 上一篇文章讲述过了,封装IO多路复用,进行事件的驱动
Accept的执行流程
- 创建
Accept类的时候,构造函数会创建socket,然后进行本地地址的绑定- 调用
func:listen执行封装了的listen然后注册listenfd可读的事件,当客户端发送了连接过来之后, listenfd可读然后执行回调函数(accept接受连接 + 用户自定义的回调函数)
具体的实现和分析:
Accept类的成员
重点关注的就是维护着listenfd的
Socket&CHANNEL, 新连接建立时候的回调函数
构造函数的实现:封装几个api
构造函数帮我们实现了
make socket,bind, listen,注册了listen的回调函数
回调函数的实现
这里面的精华所在了:
- 作为listenfd读事件触发的回调函数,代表这时候就有客户端发起连接的请求了,那么处理
accept- 将得到的
connfd作为参数发送给用户自定义的回调函数,能够支持用户的自定义函数
TcpConnection的简介和功能流程
TcpConnection其实就是表示的是一个TCP连接用于提供给包括TcpServer,TcpClient等类使用的一种类, 维护了一个连接。
enable_from_this
继承了
enable_from_this主要是因为模糊的生命期, 然后能够提供一个在本类中指向自身的指针供一些回调函数的使用,因为一些函数都是需要TcpConnection的指针作为参数进行操作的
内部实现功能
维护了通信四元组的信息,设置了一些回调函数
TcpServer执行的总的流程
TcpServer.start()->Acceptor->用户连接,拿到了连接的connfd->TcpConnection设置了回调函数->注册到EPOLLER中->执行Channel的回调函数