day18-Buffer
Buffer 是网络编程里专门用来高效收发 TCP 数据的 “内存缓冲区”,用来解决 TCP 粘包、半包、读写效率低等问题 Buffer都干什么? 接收网络数据:从 TCP 连接里读数据存起来 暂存待发送数据:要发的数据先放这里,等能发了再发 自动管理内存:自动扩容、自动整理空间,不用你手动 malloc/free Buffer.h1234567891011121314#pragma once#include <vector>#include <sys/types.h>#include <string>/*+-------------------+-----------------------+---------------------------+| 前置预留区 | 可读区 (readable) | 可写区 (writable) || (kCheapPrepend=8) | | |...
day17-TcpServer
TcpServer是用户使用 muduo 的唯一入口,负责启动服务器、接收新连接、分配 IO 线程、管理所有客户端连接。所有底层细节全部被 TcpServer 封装隐藏,用户只操作 TcpServer Callbacks.h1234567891011121314151617#pragma once#include <memory>#include <functional>class Timestamp;class Buffer;class TcpConnection;using TcpConnectionPtr = std::shared_ptr<TcpConnection>;using ConnectionCallback = std::function<void(const TcpConnectionPtr&)>;using CloseCallback = std::function<void(const TcpConnectionPtr&)>;using WriteCompleteCallback ...
day16-Acceptor
Acceptor是muduo 网络库核心的TCP 连接接收器类,专门负责监听端口、接收新的客户端 TCP 连接 Acceptor.h123456789101112#pragma once#include "noncopyable.h"#include "Channel.h"#include "Socket.h"#include <functional>class EventLoop;class InetAddrress;class Acceptor : noncopyable class Acceptor : noncopyable:Acceptor 持有唯一的监听 Socket、Channel 资源,复制会导致资源冲突、文件描述符错乱。 核心回调类型1using NewConnectionCallback = std::function<void(int sockfd, const InetAddress&)>; 当 Acceptor 接收新连接后,调用这个回调,把新连接的 fd和客...
day15-Socket
Socket 是对 Linux 系统 socket 文件描述符(fd)的 C++ 封装,专门用来管理 “监听 fd” 和 “连接 fd”,提供一套方便、安全、面向对象的接口。 Socket.h1234567#pragma once#include "noncopyable.h"class InetAddress;class Socket : noncopyable 12private: const int sockfd_; socket文件描述符 const保证一个 Socket 对象,只对应一个 fd,改不了 12345explicit Socket(int sockfd) : sockfd_(sockfd) {}~Socket();int fd() const { return sockfd_; }void shutdownWrite(); const 成员变量只能在初始化列表赋值,不能在函数体内赋值。 不加explicit可能会发生的事:本想传 Socket,结果误传了个 int,还编译通过...
day14-Thread+EventLoopThread+EventLoopThreadPool
Thread:最底层,真正的线程,负责跑 pthread。 EventLoopThread:包装类,一个线程 + 一个 loop,让线程里跑 EventLoop。 EventLoopThreadPool:管理者,创建一堆 EventLoopThread,形成线程池,对外提供 loop。 12345EventLoopThreadPool (线程池:管理一堆线程) ↓ 包含多个EventLoopThread (线程+loop:一个线程一个loop) ↓ 包含一个Thread (最底层:真正的系统线程) 1. Thread 类(真正干活的线程) 作用:创建系统线程 内部跑一个 threadFunc 函数 不关心 loop,只负责执行回调 2. EventLoopThread 类(线程绑定一个 loop) 内部创建一个 Thread 线程启动后,创建一个 EventLoop 让 loop 在这个线程里 loop() 运行 对外接口:startLoop() → 返回创建好的 EventLoop* 3. EventL...
day13-EventLoopThreadPool
EventLoopThreadPool是muduo 网络库核心的 IO 线程池类,专门用于多 Reactor 网络模型:一个主线程(baseLoop)处理连接,多个子 IO 线程处理读写事件,实现高并发网络编程。 EventLoopThreadPool = 事件循环线程池(预先创建固定数量的长期运行线程,每个线程绑定一个EventLoop,通过轮询分配网络连接) 管理一组 EventLoopThread(每个线程自带一个EventLoop) 对外提供轮询分配IO 线程的能力 保证线程安全、不可拷贝(网络库通用设计) EventLoopThreadPool.h123456789101112#pragma once#include "noncopyable.h"#include <string>#include <functional>#include <atomic>#include <vector>#include <memory>class EventLoop;class EventL...
day12-EventLoopThread
EventLoopThread = 封装Thread + 自身 EventLoop的线程类,核心实现 one loop per thread(一个线程只跑一个 EventLoop)。 EventLoopThread.h12345678910111213#pragma once#include "noncopyable.h"#include "Thread.h"#include <mutex>#include <condition_variable>#include <functional>#include <string>class EventLoop;class EventLoopThread : noncopyable 私有成员变量12345678private: void ThreadFunc(); std::mutex mutex_; std::condition_variable cond_; EventLoop* loop_; Thre...
day11-Thread
one loop per thread = 一个线程,只跑一个 EventLoop muduo 的 Thread 类 = 专门用来创建这种 “带 loop 的线程” Thread类是对线程的一个轻量级封装 Thread.h12345678910#pragma once#include "noncopyable.h"#include <atomic>#include <functional>#include <unistd.h> //pid_t#include <memory>#include <thread>#include <string> 12345class Thread : noncopyable{public: using ThreadFunc = std::function<void()>;} 一个线程对象只能代表一个线程,不能复制 定义线程要执行的函数类型,无参数、无返回值的函数 私有成员变量12345...
day10-EventLoop+Poller+Channel
一、主循环驱动流程(核心大动脉)1234567891011loop() ↓while (!quit_) ↓poller_->poll() // 阻塞等待事件 ↓activeChannels 被填充 ↓遍历 channel->handleEvent() // IO 关键路径 ↓doPendingFunctors() // 任务队列 二、Channel 注册 / 更新 / 删除 流程123456789Channel::enableReading() ↓Channel::update() ↓EventLoop::updateChannel() ↓Poller::updateChannel() ↓epoll_ctl() 12345EventLoop::removeChannel() ↓Poller::removeChannel() ↓epoll_ctl_del() 三、任务队列 完整联动(跨线程)12345678910111213141516171819202122runInLoop(cb) ↓...
day09-EventLoop
EventLoop 是 muduo 的核心,所有网络操作、所有事件、所有任务,最终都由 EventLoop 驱动。 1个EventLoop管理1个Poller+多个Channel muduo设计原理:one loop per thread EventLoop负责在单线程内处理两件事: 网络 IO 事件(内核通知的 socket 读写、连接) 用户提交的异步任务(其他线程发来的函数) EventLoop.h1234567891011121314#pragma once#include <vector>#include <atomic>#include <functional>#include <mutex>#include <memory>#include "noncopyable.h"#include "CurrentThread.h"#include "Timestamp.h"class Channel;class Poller; 头文件依赖。 1234...