news 2026/9/4 12:42:42

moduo之服务器TcpServer

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
moduo之服务器TcpServer

简介

TcpServer实现了多线程主从Reactor服务器

结构

TcpServer

Acceptor

TcpConnection

EventLoopThreadPool

TcpServer相关的回调

  • 连接建立回调ConnectionCallback connectionCallback_
  • 连接上数据到来时的回调MessageCallback messageCallback_
  • 连接上写完成回调WriteCompleteCallback writeCompleteCallback_
typedefstd::function<void(constTcpConnectionPtr&)>ConnectionCallback;typedefstd::function<void(constTcpConnectionPtr&)>WriteCompleteCallback;typedefstd::function<void(constTcpConnectionPtr&,Buffer*,Timestamp)>MessageCallback;

Acceptor新连接回调:

voidnewConnection(intsockfd,constInetAddress&peerAddr);

TcpConnection的四个回调

voidsetConnectionCallback(constConnectionCallback&cb){connectionCallback_=cb;}/// Set message callback./// Not thread safe.voidsetMessageCallback(constMessageCallback&cb){messageCallback_=cb;}/// Set write complete callback./// Not thread safe.voidsetWriteCompleteCallback(constWriteCompleteCallback&cb){writeCompleteCallback_=cb;}voidremoveConnection(constTcpConnectionPtr&conn);

事件循环线程池线程启动初始回调:

voidsetThreadInitCallback(constThreadInitCallback&cb){threadInitCallback_=cb;}

Acceptor连接回调

  • 从事件循环池中轮循方式选取一个
  • 创建TcpConnection,将TcpServer设置的connectionCallback_,messageCallback_writeCompleteCallback_传递到TcpConnection,同时设置关闭连接的回调removeConnection
  • 创建连接建立的任务connectEstablished放入连接事件循环的队列中异步执行
voidTcpServer::newConnection(intsockfd,constInetAddress&peerAddr){loop_->assertInLoopThread();EventLoop*ioLoop=threadPool_->getNextLoop();charbuf[64];snprintf(buf,sizeofbuf,"-%s#%d",ipPort_.c_str(),nextConnId_);++nextConnId_;string connName=name_+buf;LOG_INFO<<"TcpServer::newConnection ["<<name_<<"] - new connection ["<<connName<<"] from "<<peerAddr.toIpPort();InetAddresslocalAddr(sockets::getLocalAddr(sockfd));// FIXME poll with zero timeout to double confirm the new connection// FIXME use make_shared if necessaryTcpConnectionPtrconn(newTcpConnection(ioLoop,connName,sockfd,localAddr,peerAddr));connections_[connName]=conn;conn->setConnectionCallback(connectionCallback_);conn->setMessageCallback(messageCallback_);conn->setWriteCompleteCallback(writeCompleteCallback_);conn->setCloseCallback(std::bind(&TcpServer::removeConnection,this,_1));// FIXME: unsafeioLoop->runInLoop(std::bind(&TcpConnection::connectEstablished,conn));}

连接建立回调connectEstablished

  • 设置连接状态为kConnected
  • 事件通道绑定连接对象,开启读事件
  • 执行事件回调connectionCallback_
voidTcpConnection::connectEstablished(){loop_->assertInLoopThread();assert(state_==kConnecting);setState(kConnected);channel_->tie(shared_from_this());channel_->enableReading();connectionCallback_(shared_from_this());}

关闭连接回调

  • 添加任务removeConnectionInLoop到acceptor所在的事件循环队列中异步执行
  • 连接容器中删除对应连接
  • 添加任务connectDestroyed到连接所在的事件循环队列中异步执行
voidTcpServer::removeConnection(constTcpConnectionPtr&conn){// FIXME: unsafeloop_->runInLoop(std::bind(&TcpServer::removeConnectionInLoop,this,conn));}voidTcpServer::removeConnectionInLoop(constTcpConnectionPtr&conn){loop_->assertInLoopThread();LOG_INFO<<"TcpServer::removeConnectionInLoop ["<<name_<<"] - connection "<<conn->name();size_t n=connections_.erase(conn->name());(void)n;assert(n==1);EventLoop*ioLoop=conn->getLoop();ioLoop->queueInLoop(std::bind(&TcpConnection::connectDestroyed,conn));}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 12:42:39

3分钟出片:用Pixelle-Video免费生成专业AI短视频

3分钟出片&#xff1a;用Pixelle-Video免费生成专业AI短视频 【免费下载链接】Pixelle-Video &#x1f680; AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video 写脚本、找配图、录音、剪辑…

作者头像 李华
网站建设 2026/9/4 12:42:34

微信聊天记录导出:3步把聊天存成HTML、Word和CSV

微信聊天记录导出&#xff1a;3步把聊天存成HTML、Word和CSV 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg …

作者头像 李华
网站建设 2026/9/4 12:41:00

Replit 支持 MCP:任意客户端远程操控云端 AI Agent

这次我们来看一个非常关键的更新&#xff1a;Replit 正式发布了对 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;的支持。这意味着你不再需要打开 Replit 网页端&#xff0c;而是可以从任意支持 MCP 的客户端里&#xff0c;直接操控 Replit Ag…

作者头像 李华
网站建设 2026/9/4 12:39:17

LabVIEW实现液压PID控制:从算法原理到工程实践全解析

简介&#xff1a;本资源面向自动化控制领域工程师、高校机电/测控专业师生及LabVIEW初学者&#xff0c;提供一套完整的比例阀控液压缸PID闭环控制系统设计与实现方案。资源聚焦工业现场常见的电液伺服控制场景&#xff0c;通过LabVIEW图形化编程实现位置式PID算法开发、系统建模…

作者头像 李华
网站建设 2026/9/4 12:39:06

CANoe - Panel

文章目录1. 简介2. 新建/添加/删除/重命名 Panel 面板2.1 新建 Panel 面板2.2 添加 Panel 面板2.3 删除 Panel 面板2.4 重命名 Panel 面板3. 控件功能3.1 Pointer3.2 Analog Gauge3.3 Button3.4 CAPL Output View3.5 Check Box3.6 Clinometer3.7 Clock Control3.8 Combo Box3.9…

作者头像 李华
网站建设 2026/9/4 12:36:29

嵌入式固件进阶:启动流程、故障定位与OTA升级实战指南

1. 为什么嵌入式固件越来越需要“进阶”思维先说个我在技术社区里观察到的现象。这几年嵌入式岗位的要求变化非常明显&#xff0c;五年前会配置个寄存器、能点个灯、调通个UART&#xff0c;基本就能应付大部分工作。现在再去招聘网站上看&#xff0c;但凡薪资过得去的嵌入式岗位…

作者头像 李华