Muduo库源码剖析(4) Acceptor
Socket + Acceptor 详解
本章我们将学习Socket类和Acceptor类, 首先应当明确其在Muduo库中的职责所在 :
Socket就是对原生socketAPI的封装, 供Acceptor使用.
Acceptor简单来说是用来处理新连接的建立的. 我们来认识一下Acceptor的调用流程
TcpServer中会维护一个Acceptor作为成员变量, 由TcpServer向Acceptor设置建立新连接的回调函数, Acceptor则内含一个Socket和一个Channel, 其利用Socket维护listensocketfd, 控制listen的时机, 也利用Channel让Poller帮自己监听listensocketfd上的读事件, 设置的读事件回调就会调用accept获取新连接的connfd, 然后利用得到的connfd去调用TcpServer传入的回调函数, 让TcpServer帮自己处理新连接事务.
Socket
1 |
|
1 |
|
外部通过socket函数将listensocketfd传入Socket, 将其维护在Socket内, 便于简便的调用bind / listen / accept.
Acceptor
1 |
|
1 |
|
- createNonblocking : 我们可以看到这个函数在Accept构造函数中被调用, 也就是说在Acceptor构造时会调用该函数构造一个非阻塞的listensocketfd.
- 构造函数 : 首先是调用createNonblocking构造出listensocketfd存入Socket, 随后将listensocketfd封装进Channel, 接下来设置Socket中fd的各种属性并bind, 最后将handleRead读事件回调注册进Channel.
- listen : 该函数控制何时开始监听listensocketfd并注册读事件, 一般由上层TcpServer控制.
- handleRead : listensocketfd封装的Channel将被放到mainLoop的Poller中监听读事件, 而触发的回调就是该函数, handleRead将调用accept获取新连接的connfd, 随后将其传给TcpServer设置的回调函数.
为什么要调用TcpServer的新连接回调呢? 因为Acceptor的职责仅仅在于构造listensocketfd和对新连接及时做出反应并报告给TcpServer, TcpServer才是真正处理新连接的核心, 其拥有的资源远超过Acceptor(例如线程池), 有了这些资源才能真正处理新连接.
by 天目中云
Muduo库源码剖析(4) Acceptor
http://example.com/2025/04/17/Muduo库源码剖析(4) Acceptor/