#TCPServer Class
源码阅读(muduo::net)
跟着大佬走,走的就是快呀
TCPServer
是服务器类,直接提供给用户使用,用户通过注册回调函数来实现业务逻辑。
数据成员
EventLoop* loop_
本
TCPServer Class
对象所属EventLoop
对象
const string ipPort_
字符串类型的ip地址和端口号
cosnt string name_
名称,用于输出调试信息
std::unique_ptr<Acceptor> acceptor_
本对象拥有的
Acceptor
对象
std::shared_ptr<EventLoopThreadPool> threadPool_
一个
TCPServer
可以有多个EventLoop
对应多个loop线程。
通常是一个loop负责accept新连接,然后把新连接分到其它的loop进行服务。如果启用了reuseport
,还可以直接创建多个绑定到同一IP和端口号的TCPServer(by吴悠大佬)
connectionCallback_
用户注册的回调函数,在连接建立和断开时调用
messageCallback_
用户注册的回调函数,在TcpConnection的inputBuffer有新数据到达时被调用
writeCompleteCallback_
用户注册的回调函数,在数据发送完成时调用
threadInitCallback_
用户注册的回调函数,在loop线程启动后调用
AtomicInt32 start3d_
原子变量,用于判断
TCPServer
有没有启动
int nextConnId_
std::map<string, TcpConnectionPtr> connections_
通过名称来记录生成的连接
函数成员
TcpServer(EventLoop* loop,const InetAddress& listenAddr,const string& nameArg,Option option = kNoReusePort);
构造函数,初始化
acceptor_
、threadPool_
、connectionCallback_
和messageCallback_
等成员变量。并设置acceptor
的newConnection
为TcpServer::newConnection
。
void setThreadNum(int numThreads)
调用
EventLoopThreadPool::setThreadNum
设置线程数量
void start()
开始执行。设
started_
为1;调用threadPool_::start()
启动loop线程池;将acceptor_
转为侦听态的任务交给loop_
去执行(loop_->runInLoop
)。
void newConnection(int sockfd,const InetAddress& peerAddr)
当有新连接到达时执行。
- 通过
threadPool_->getNextLoop()
获取loop池中的一个对象,命名为ioLoop
- 使用
ipPort
和nextConnId_
给新的TcpConnectionPtr
做名称- 初始化新
TcpConnection
- 建立
connections_
中的表项- 设置各种回调函数
- 将
TcpConnection::connectEstablished
交给ioLoop
去执行
void removeConnection(const TcpConnectionPtr& conn)
将
TcpServer::removeConnectionInLoop
交给loop_
。
void removeConnectionInLoop(const TcpConnectionPtr* conn)
在
connections_
中剔除表项。将TcpConnection::connectDestroyed()
交给ioLoop
去执行