34.muduo学习笔记之net_TcpServer.{h&cc}

本文详细介绍了TcpServer类的设计与实现,包括其核心组件如Acceptor、EventLoop、EventLoopThreadPool等的使用,以及关键回调函数如连接、消息、写完成的设置。深入探讨了线程池、连接管理及事件循环的机制。

1. 说明

  1. 一个TcpServer类,这个需要配合TcPConnection类理解
  2. 使用了Acceptor,EventLoop,EventLoopThreadPool,原子类
  3. noncopyable

2. 变量

  1. 类型定义

    • ThreadInitCallback
    • ConnectionMap
  2. 枚举类型

    • kNoReusePort
    • kReusePort
  3. EventLoop* loop_; // the acceptor loop

    • 一个线程一个EventLoop
  4. const string ipPort_;

    • 服务端口
  5. const string name_;

    • 服务名
  6. std::unique_ptr acceptor_; // avoid revealing Acceptor

    • 提供监听套接字创建绑定功能
  7. std::shared_ptr threadPool_;

    • 线程池指针
  8. ConnectionCallback connectionCallback_;

    • 连接到来的回调函数
  9. MessageCallback messageCallback_;

    • 消息到来的回调函数,以上两个都在Callback.h中定义
  10. WriteCompleteCallback writeCompleteCallback_;

    • 写完成回调函数
  11. ThreadInitCallback threadInitCallback_;

    • 线程初始回调函数
  12. AtomicInt32 started_;

    • 判断是否开始,一开始为0,在start()函数中判断
  13. int nextConnId_;

    • 下一个连接ID
  14. ConnectionMap connections_

    • 连接列表,实际是TcpConnection指针列表

3. 函数

1. 私有

  1. void newConnection(int sockfd, const InetAddress& peerAddr);

    • 该函数作为acceptor_的新连接建立回调函数
    • 新建一个TcpConnectionPtr连接对象,设置一些回调函数,最后运行TcpConnection::connectEstablished函数,这个函数就是把通道加入到Poller进行关注
  2. void removeConnection(const TcpConnectionPtr& conn);

    • 连接的关闭回调函数,调用removeConnectionInLoop
  3. void removeConnectionInLoop(const TcpConnectionPtr& conn);

    • 从连接列表中移除这个连接,获得该连接的loop事件.把TcpConnection的connectDestroyed()函数加入到loop事件中

2. 公有

  1. 构造

    • 需要传参EventLoop*,InetAddress&,服务名称字符串和枚举option
    • 各变量的初始化,新建Acceptor和EventLoopThreadPool,设置Acceptor的连接回调函数为newConnection.
  2. 析构

    • 释放资源,把每一个连接的析构函数加入到每个连接的loop事件中
  3. const string& ipPort() const

    • 返回服务端口
  4. const string& name() const

    • 返回服务名
  5. EventLoop* getLoop() const

    • 返回loop_,EventLoop
  6. void setThreadNum(int numThreads)

    • 调用threadPool_->setThreadNum()设置线程池的数量
  7. void setThreadInitCallback(const ThreadInitCallback& cb)

    • 设置线程初始化回调函数
  8. std::shared_ptr threadPool()

    • 返回线程池指针
  9. void start()

    • 该函数可以多次调用,可以跨线程调用
    • 线程池start(),开启acceptor_的listen()函数,get_pointer()是muduo的获得智能指针的裸指针的函数
  10. void setConnectionCallback(const ConnectionCallback& cb)

    • 设置连接到来时的回调函数
  11. void setMessageCallback(const MessageCallback& cb)

    • 设置消息到来时的回调函数
  12. void setWriteCompleteCallback(const WriteCompleteCallback& cb)

    • 设置写完成的回调函数
### 关于 `muduo` 库中 `tcpserver.h` 文件缺失的原因分析 在使用 `muduo` 网络库的过程中,如果遇到 `tcpserver.h` 文件缺失的情况,可能是由于以下几个原因造成的: #### 1. **未正确下载完整的源码包** 如果从不完整的资源或者错误的版本获取了 `muduo` 的源码,则可能导致某些头文件(如 `tcpserver.h`)不存在。建议重新确认是否已下载官方发布的完整版源码[^1]。 #### 2. **路径配置问题** 即使已经拥有完整的源码,在构建项目时如果没有正确设置包含路径 (`include path`) 或者链接器选项,也可能导致编译器无法找到该头文件。可以通过调整 CMakeLists.txt 中的相关配置来解决问题[^3]。 #### 3. **版本差异引起的兼容性问题** 不同版本之间可能存在 API 变更或结构调整,比如某个特定功能被移到其他模块里去了。因此需要仔细核对所使用的具体分支/标签号以及对应的文档说明[^2]。 --- ### 解决方案 以下是针对上述可能原因提出的几种解决办法: #### 方法一:验证并更新至最新稳定版本 确保当前操作基于最新的发布版本而非开发中的不稳定状态;访问 GitHub 官方仓库页面查看 Release Notes 并按照指示升级代码基线。 ```bash git clone https://github.com/chenshuo/muduo.git cd muduo git checkout tags/vX.Y.Z # 替换 X.Y.Z 表示期望的目标发行编号 ``` #### 方法二:检查依赖关系与环境变量设定 对于跨平台工具链而言,有时缺少必要的外部库支持也会间接影响内部组件可用性。例如 Boost 是一个常见的前提条件之一,需事先完成其本地部署后再继续尝试安装 Muduo。 - 下载 Boost 源码压缩包解压后执行如下命令序列: ```bash ./bootstrap.sh --prefix=/usr/local/ sudo ./b2 install export BOOST_ROOT=/usr/local/include/boost ``` 随后修改 Makefile.am 添加额外标志 `-I${BOOST_ROOT}` 来告知预处理器查找位置。 #### 方法三:手动复制遗漏项回原目录结构内 假如经过排查发现确实存在个别重要单元遗失现象的话,可以从网上搜索相似主题帖子里面附带补丁附件直接应用上去即可恢复正常使用状况[^4]。 --- ### 示例代码片段展示如何定义回调处理程序 下面给出一段简单的例子演示怎样利用 TcpServer 类型创建服务器端实例对象的同时注册消息到达事件监听逻辑部分: ```cpp #include "muduo/net/TcpServer.h" #include "muduo/net/EventLoop.h" using namespace muduo; using namespace muduo::net; void onMessage(const TcpConnectionPtr& conn, Buffer* buf, Timestamp time){ std::string msg(buf->retrieveAllAsString()); LOG_INFO << conn->name() << " receives " << msg.size() << " bytes at " << time.toString(); } int main(){ EventLoop loop; InetAddress listenAddr(9981); TcpServer server(&loop,"TestServer",listenAddr); server.setThreadNum(3); // 设置多线程模式下的工作线程数量 server.setMessageCallback(onMessage); server.start(); loop.loop(); return 0; } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值