news 2026/5/29 16:28:27

ZLMediaKit 源码分析(三):TCP 连接管理与 Session 生命周期

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ZLMediaKit 源码分析(三):TCP 连接管理与 Session 生命周期

本文从 TcpServer accept 新连接开始,追踪 Socket、Session 的创建、数据读取、生命周期管理的完整流程,深入到 epoll 事件注册、recv 系统调用级别。

1. 核心类关系

TcpServer Session 工厂 + 监听 Socket 持有者 │ ├─ Socket fd 封装,管理读写回调 │ ├─ _sock_fd 原始 fd │ ├─ _poller 所属 EventPoller │ ├─ _on_read_cb 数据到达回调 │ └─ _on_err_cb 错误回调 │ └─ Session (TcpSession) 业务会话 ├─ _sock Socket::Ptr(共享所有权) ├─ onRecv() 纯虚函数,子类实现 └─ onError() 错误处理

继承体系:

classSession:publicstd::enable_shared_from_this<Session>{// 基础会话,携带 Socket};classTcpSession:publicSession{// TCP 会话基类virtualvoidonRecv(constBuffer::Ptr&buf)=0;};classRtspSession:publicTcpSession,publicRtspSplitter,...{// RTSP 协议会话};

2. TcpServer 启动与监听

2.1 start 模板函数

// ZLToolKit/src/TcpServer.htemplate<typenameSessionType>voidTcpServer::start(uint16_tport,...){// 保存 Session 工厂_session_creator=[](constSocket::Ptr&sock,constSockAddress&addr)->Session::Ptr{returnstd::make_shared<SessionType>(sock,addr);};// 开始监听start_l(port);}

2.2 start_l — 绑定与监听

voidTcpServer::start_l(uint16_tport){_socket=Socket::createSocket(_poller,true);// 1. socket() → 返回 fd// 2. setsockopt(SO_REUSEADDR)// 3. bind("0.0.0.0", port)// 4. listen(SOMAXCONN)_socket->bind(port);// 5. 注册 accept 回调_socket->setOnAccept([this](constSocket::Ptr&sock,constSockAddress&addr){onAcceptConnection(sock,addr);});// 6. 将 listen_fd 注册到 epoll// epoll_ctl(_epoll_fd, EPOLL_CTL_ADD, listen_fd, EPOLLIN)}

网络库级调用链

Socket::bind() → ::socket(AF_INET, SOCK_STREAM, 0) → ::setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, ...) → ::bind(fd, (struct sockaddr*)&addr, sizeof(addr)) → ::listen(fd, SOMAXCONN) → Socket::setOnAccept() → EventPoller::addEvent(fd, EPOLLIN, accept_cb) → epoll_ctl(_epoll_fd, EPOLL_CTL_ADD, fd, &ev)

3. 新连接 Accept 流程

当 epoll_wait 检测到 listen_fd 可读时:

3.1 Socket::onAccept

voidSocket::onAccept(){while(true){// 系统调用:accept4(非阻塞)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 16:27:12

终极E-Ink Launcher指南:为电纸书打造极简Android启动器

终极E-Ink Launcher指南&#xff1a;为电纸书打造极简Android启动器 【免费下载链接】E-Ink-Launcher E-reader Launcher for Android, Electronic paper book... 项目地址: https://gitcode.com/gh_mirrors/ei/E-Ink-Launcher 你是否厌倦了电纸书上复杂臃肿的原生界面&…

作者头像 李华
网站建设 2026/5/29 16:26:41

Unlock-Music:浏览器端音乐文件解密转换终极指南

Unlock-Music&#xff1a;浏览器端音乐文件解密转换终极指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://gi…

作者头像 李华
网站建设 2026/5/29 16:15:28

AI偏见溯源与治理:从数据、算法到系统构建的实战指南

1. 项目概述&#xff1a;一个被误解的真相 “AI本质上是中立的——是人类存在偏见&#xff0c;机器只是在复制它们。”这句话乍一听像是一句技术哲学的口号&#xff0c;但在我过去十多年与算法、数据和产品打交道的经历里&#xff0c;它不是一个观点&#xff0c;而是一个每天都…

作者头像 李华
网站建设 2026/5/29 16:13:26

别再踩坑了!用U盘装Ubuntu 20.04时,GPT分区表下ESP/EFI分区千万别删

拯救你的Ubuntu安装&#xff1a;GPT分区表下ESP/EFI分区的关键作用与修复指南你是否曾经在安装Ubuntu 20.04时遇到过"Invalid Partition Table"的错误提示&#xff1f;那种安装过程看似顺利&#xff0c;却在重启后遭遇系统无法启动的挫败感&#xff0c;往往源于一个被…

作者头像 李华
网站建设 2026/5/29 16:12:07

从告警疲劳到智能洞察:Keep如何重构AIOps技术范式

从告警疲劳到智能洞察&#xff1a;Keep如何重构AIOps技术范式 【免费下载链接】keep The open-source AIOps and alert management platform 项目地址: https://gitcode.com/GitHub_Trending/kee/keep 在数字化转型的深水区&#xff0c;运维团队正面临一个残酷的现实&am…

作者头像 李华
网站建设 2026/5/29 16:10:26

KMS智能激活工具:Windows和Office一键永久激活完整指南

KMS智能激活工具&#xff1a;Windows和Office一键永久激活完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗&#xff1f;每次重装系统后都要重新激活Office&…

作者头像 李华