• 仿照muduo库实现一个高并发服务器

仿照muduo库实现一个高并发服务器

2026-01-29 14:57:37 栏目:帮助文档 4 阅读

项目介绍

Muduo网络库是由陈硕开发的一个基于C++的现代网络编程库,专注于高并发TCP网络应用的开发。‌它采用非阻塞I/O和事件驱动机制,能够高效处理大量并发连接。‌核心设计基于主从Reactor模型,其线程模型被称为“one loop per thread”。在这种模型中,每个线程仅运行一个事件循环(EventLoop),负责监听和响应定时器事件及I/O事件;同时,每个文件描述符(如TCP连接)只能由一个线程进行读写操作,即每个连接必须固定归属于某个EventLoop进行管理。‌这种设计避免了复杂的线程同步问题,提升了多线程环境下的并发性能。

本项目的旨在于实现高并发的服务器组件,可以在短时间内简洁完成一个高性能的服务器搭建。同时我们的组件提供应用层的协议支持,通过该支持可以让我们快速完成服务器搭建。在本项目中为了方便演示,我们采用的应用层协议为HTTP协议。(但根据具体业务需求的不同,编写不同的协议支持即可)

项目地址:https://github.com/XiaoLiang428/Reactor

认识Reactor模式

Reactor(反应器)模式是一种事件驱动的设计模式,用于处理多个并发输入源。它通过事件分发机制将服务请求分发给相应的请求处理器。

在该项目实现中就是哪一个客户端向服务器发送了数据,服务器就会去处理该客户发送的数据;对于没有发送数据的客户端,服务器则不会采取任何行动。这就是事件驱动处理模式。那么服务器是如何知晓哪个客户端触发了对应的事件从而需要服务器采取行动呢?这就要使用一个非常关键的技术——I/O多路复用(上一篇文章提及),统一监听对应的文件描述符,当一个或多个文件描述符的对应事件触发后再将其分给从属线程进行处理。

三种Reactor模式

1.单Reactor单线程:在单个线程中进行监听和业务处理

优点:因为是单线程,使用操作都是串行化的,思想比较简单因此编码较为容易

缺点:所有的任务都是在一个线程中进行处理因此容易造成性能瓶颈

2.单Reactor多线程:一个Reactor线程 + 业务线程池

优点:充分利用CPU多核资源,处理效率可以更高,降低代码耦合度

缺点:唯一的Reactor线程需要充当监听新连接的到来还需要对客户端事件进行监控,以及客户端的一系列I/O操作,不利于高并发场景。

3.多Reactor多线程:多个Reactor线程 + 业务线程池

优点:充分利用CPU多核资源,并且进行合理分配

但是执行流并不是越多越好,不同执行流的切换也会有开销。

本项目的TcpServer实现实现方式为One Thread One Loop主从Reactor模型

1.主从Reactor模型服务器

2.一个线程对应一个循环,循环操作:对该线程中管理的连接进行I/O事件监控+I/O操作+业务处理

根据上面三种Reactor模式的优缺点我们最后选择的是多Reactor的模式,但我们并不适用业务线程池去处理业务,而是在从属Reactor中完成业务的处理,这是为了避免有多个执行流切换导致性能下降。对于每一个连接的所有操作来说,它只会在从属Reactor线程中执行因此我们不需要去考虑其被其他线程争抢,这就是我们one thread one loop思想的模式。

总体模块介绍

我们实现的是一个带有协议支持的Reactor模型高性能服务器,总体可以分为两块:

第一块是Server模块,主要功能是Reactor模型高性能TCP服务器

第二块是协议模块,对当前Reactor模型高性能服务器提供应用层的协议支持

Server模块

本模块需要对所有的连接和从属线程进行管理,让它们各司其职一起经营好这个高并发服务器。本模块主要分为一下几个方面:

1.监听连接管理,负责接收新到来的连接,然后处理新到的连接添加到连接管理列表之中进行有效的管理并初始化这些连接的信息。

2.通信连接管理,负责管理正在与服务器进行通信的连接,方便主线程进行连接的管理。

3.连接超时管理,负责释放长时间不活跃的连接,避免服务器的资源被浪费。

4.线程管理,创建从属线程并管理好从属线程。

下面介绍TcpServer下的各个子模块及其作用

Buffer模块

Buffer模块是一个缓冲区,用于扮演通信中接收缓冲区和发送缓冲区的角色。

Socket模块

Socket模块是对socket套接字操作的一系列封装,方便我们后续的使用。

Channel模块

Channel 模块封装了一个连接对应的文件描述符及其所关心的事件。Channel 并不直接监控这些事件,而是由 Poller 统一管理。当Poller 检测到某个文件描述符上的事件发生时,它会通知对应的 Channel,然后 Channel 会调用预先设置好的回调函数来处理该事件。简而言之,Channel 是文件描述符、事件和事件处理逻辑之间的桥梁。

Connection模块

Connection 模块是对单个 TCP 连接的抽象和封装。每个 Connection 对象代表一个客户端连接,并管理该连接的整个生命周期。
它的核心作用包括:
1.封装资源:它封装了与连接相关的核心资源,包括 socket 文件描述符、输入/输出 Buffer,以及用于事件分发的 Channel。
2. 生命周期管理:它负责处理连接的建立、数据收发、以及最终的关闭和资源释放。通过状态(ConnectionStatus)来跟踪连接的当前状态(如 CONNECTED, DISCONNECTING)。
3. 事件处理:它将底层的 Channel 事件(可读、可写、关闭、错误)转化为更高级别的回调函数(_conn_cb, _msg_cb, _close_cb),供用户(TcpServer 的使用者)定义业务逻辑。
4. 线程安全:它保证了所有操作都在其所属的 EventLoop 线程中执行,从而避免了多线程环境下的竞态条件。外部线程的调用(如 Send, ShutDown)会被安全地转移到 EventLoop 线程中执行。
5. 数据缓冲:通过内置的 _in_buffer 和 _out_buffer,它管理了数据的收发缓冲,并处理了非阻塞 I/O 中数据可能无法一次性完整读写的情况。
6. 附加功能:它还提供了如非活跃连接自动释放(通过 TimeWheel)、协议升级(Upgrade)等高级功能。
总而言之,Connection 模块为上层业务逻辑提供了一个清晰、安全、易于使用的 TCP 连接接口,将复杂的底层网络 I/O 和并发细节隐藏了起来。

Acceptor模块

Acceptor 模块是服务器中专门负责接收新 TCP 连接的组件。它运行在主 EventLoop 中(即 TcpServer 里的 _base_loop),只专注于高效地接受新连接:监听端口,等待客户端连接,然后将建立好的连接(以文件描述符的形式)分发出去。

TimeWheel模块(TimeQueue模块)

TimeWheel 模块在您的代码中实现了一个时间轮,这是一种高效管理大量定时任务的数据结构,其核心作用是处理有时效性的事件,例如自动断开不活跃的连接。它通过 timerfd 创建一个每秒触发一次的定时器,每次触发时,时间轮的指针(_tick)就向前移动一格。当指针扫过某个格子时,该格子中所有到期的定时任务(Timer 对象)就会被释放,从而触发其析构函数中绑-定的回调任务。该模块通过将所有操作(如添加、刷新、取消定时器)都放入其所属的 EventLoop 线程中执行,解决了多线程环境下的同步问题。

Poller模块

Poller 包装了 Linux 的 epoll 机制,是整个事件驱动模型的心脏。它将底层的、面向文件描述符的 epoll 调用,抽象成了面向 Channel 的、更高级别的接口。它本身不处理任何具体的 I/O 逻辑,而是专注于“等待并报告哪些 Channel 上有事件发生”。实现了事件检测(Poller 的职责)与事件处理(Channel 和其回调函数的职责)的分离。

EventLoop模块

EventLoop 是连接所有模块的中央调度器。它通过 Poller 监听 I/O 事件,通过 Channel 分发事件,通过任务队列实现跨线程通信,通过 TimeWheel 管理定时任务。它将并发的、异步的事件处理流程,转化为在其自身线程内的一个有序的、串行的执行序列,极大地简化了并发网络编程的复杂性。

为什么要一个EvnetLoop对应一个线程?
一个 Connection 对象及其 Channel 都属于一个 EventLoop 线程。如果另一个线程(比如主线程或其他 I/O 线程)想对这个 Connection 进行操作(如发送数据),直接调用其方法会引发线程安全问题。
解决方案:EventLoop 提供了 RunInLoop 和 QueueInLoop 机制。当一个外部线程需要在一个 EventLoop 中执行某个操作时,它会调用该 loop 的 RunInLoop(task)。RunInLoop 判断当前调用者是否为 EventLoop 自己的线程。如果不是,它会将 task 放入一个由互斥锁 _mutex 保护的 _task 任务队列中。任务入队后,它会调用 WeakUpEventFd(),向一个特殊的 _event_fd (eventfd) 文件描述符写入一个字节。由于这个 _event_fd 也被 Poller 监控着,写入操作会使其变为可读,从而唤醒正在 _poller.Poll() 中阻塞的 EventLoop 线程。EventLoop 被唤醒后,在处理完 I/O 事件后调用的 RunAllTasks() 方法中,就会从任务队列里取出并执行这个 task。通过这种方式,所有对 EventLoop 所管理资源的操作都被安全地转移到了 EventLoop 自己的线程中执行,从而保证了线程安全。

TcpServer模块

TcpServer 模块是整个网络库的顶层封装和最终用户接口,它将所有底层组件(如 Acceptor、LoopThreadPool、Connection)组合在一起,构建了一个完整的多线程事件驱动服务器。它的核心职责是:通过持有的 Acceptor 在主 EventLoop 中监听并接受新连接,然后利用 LoopThreadPool 以轮询(Round-Robin)的方式将新创建的 Connection 对象分发给一个从属的 EventLoop 线程进行管理。TcpServer 还负责维护所有连接的映射表,并向用户提供了设置连接建立、消息到达和连接关闭等核心事件回调的接口,从而将复杂的网络并发细节与上层业务逻辑清晰地分离开来。

通信连接管理模块的关系图

当socket接收到数据后,数据被存放在接收缓冲区buffer中,然后对应的读事件被触发,从而调用TcpServer设置的读事件回调函数并且刷新连接的活跃度,同时还会去执行组件使用者自身设置的读事件触发的回调函数。

监听连接管理的关系图

一旦有新的连接到来就会触发对应的读事件,然后执行对应的回调函数,该回调函数会为新连接初始化Connection对象并设置一系列的回调函数然后将其添加到连接管理和Poller监控中,一旦该连接有事件被触发就可以执行对应的回调函数。

事件监听管理的关系图

这个模块是事件监听,是每个从属线程都具有的。该模块主要是从属线程管理对应主线程分配给从属线程的连接,管理该连接的事件触发、连接的活跃度等等。

Server中模块的具体实现

TimeWheel模块

该模块是用来判断连接是否超时,如果超时了需要需要释放该连接。

timefd的认识与使用

Linux是为用户提供的定时器:

timerfd_create(int clockid,int flags)

Linux下一切接文件,定时器创建返回的是一个文件描述符,对该描述符操作就是对定时器操作。

参数:clockid是指定时钟源。可以选择CLOCK_REALTIME:系统实时时间(可被系统时间修改影响)、CLOCK_MONOTONIC:从系统启动开始计时,不受系统时间修改影响;flags控制文件描述符的行为,可选TFD_NONBLOCK:设置文件描述符为非阻塞模式 、TFD_CLOEXEC:设置 close-on-exec 标志(执行 exec 时自动关闭)。

返回值:返回一个文件描述符

定时器的原理:每隔固定的时间(定时器被设置的时间),系统就会向对应的文件描述符(定时器)写入一个8字节的数据。如果一个定时器的时间设定为3s,那么每个3s就会向描述符写入1。你如果6s只后读取该文件描述符就会读到2,表示该定时器已经超时了2次。

timefd_settime(int fd,int flags,const struct itimerspec *new_value,struct itimerspec *_Nullable old_value)

该函数是用来启动定时器,可以通过new_value来设置首次触发事件和后续间隔时间。

参数:fd是定时器对应的文件描述符,flags可以选0(相对时间模式)或TFD_TIMER_ABSTIME(绝对时间模式),new_value定义定时器的首次触发事件和后续间隔事件,old_value获取之前的定时器设置(用于还原之前定时器的设置,如果没有此需求可以设置为NULL)。

时间轮定时器思想

我们的服务器势必会同时维护大量的连接,如果每隔固定时间都去遍历一遍这些连接判断是否超时肯定会耗费大量CPU资源导致效率低下。因此我们采用小根堆的方式来判断堆顶是否从超时,如果没有超时那么其他的连接肯定也不会超时,如果其超时那么就需要一致检测堆顶连接直到其不再超时。

但是我们介绍一个更好的方案——时间轮

时间轮的算法思想借鉴了时钟的运作机制。想象一下设定一个三点钟的闹钟:当时针指向数字三的那一刻,闹钟便会响起。我们将这一直观的时空映射转化为精妙的算法结构。在实现上,我们采用一个环形队列(通常基于数组实现)来模拟表盘。每个时间刻度对应队列中的一个槽位,代表一个特定的时间点或时间间隔。当需要为某个连接设置超时或定时任务(例如释放资源)时,我们并非将其放入一个需要主动轮询的列表,而是将它精确地“放置”在未来对应时刻的槽位中。系统维护一个指针,如同时钟的指针一样,随着时间推移指针在环形队列中步进。当指针移动到某个槽位时,该槽位中所有累积的任务(释放连接)便会自动触发执行。这一机制将 O(n) 的遍历检查复杂度优化为 O(1) 的指针移动操作,从而实现了高效的大规模定时任务管理。

时间轮算法通过环形队列结构实现了定时器的高效管理,但仍面临一个关键挑战:如何支持连接的动态刷新机制?为此,我们提出了一种融合类析构函数与智能指针的创新设计。

类的析构函数 + 智能指针shared_ptr

1.通过类封装与析构机制将定时任务抽象为独立对象。我们设计一个专门的定时任务类,在其析构函数中封装具体的超时处理逻辑(如释放不活跃连接)。这样,当该对象生命周期结束时,便会自动触发预设的回调操作,实现定时任务的自动执行。

2.借助智能指针与环形队列实现任务的灵活调度。我们将每个定时任务对象包装在shared_ptr中,并置入时间轮的环形队列相应槽位。随着时间指针的循环推进,当指针移动到某个槽位时,只需清空该位置所有智能指针指向的对象。由于shared_ptr的自动引用计数管理,当槽位中的指针被清除后,若该任务对象不再被其他代码引用,其引用计数将归零,从而自动触发析构函数,执行连接释放等清理工作。

using TaskFunc = std::function;
using ReleaseFunc = std::function;
class Timer
{
private:
    uint64_t _id; // Timer的_id是由主base线程进行统一分配,防止多线程中有_id重复从而导致哈希表中的信息错乱
    uint32_t _timeout;
    bool _cancel;
    TaskFunc _task_cb;
    ReleaseFunc _release_cb;

public:
    Timer(uint64_t id, uint32_t timeout, const TaskFunc &cb) : _id(id), _timeout(timeout), _task_cb(cb), _cancel(false) {}
    void SetRelease(const ReleaseFunc &cb) { _release_cb = cb; }
    void Cancel() { _cancel = true; }
    ~Timer()
    {
        if (!_cancel) //任务未取消才执行
            _task_cb();
        _release_cb();
    }
    uint32_t GetTimeout() { return _timeout; }
};

class TimeWheel
{
    using PtrTask = std::shared_ptr;
    using WeakTask = std::weak_ptr;

private:
    int _tick;                                      // 当前的秒针,走到哪个位置就释放哪个位置
    int _capacity;                                  // 表盘的大小
    std::vector> _wheel;       // 存储表盘中的内容
    std::unordered_map _timers; // 将Timer存入到哈希表中方便我们寻找到对应的事件进行更新操作 此处使用weak_ptr是防止_wheel中的内容引用计数无法减到零从而无法析构的问题
    void RemoveTimer(uint64_t id)                   // 从unordered_map中移除Timer信息
    {
        auto it = _timers.find(id);
        if (it == _timers.end())
        {
            return;
        }
        _timers.erase(it);
    }

public:
    TimeWheel() : _tick(0), _capacity(60), _wheel(_capacity) {};
    void AddTimer(uint64_t id, uint32_t delay, const TaskFunc &cb)
    {
        PtrTask pt(new Timer(id, delay, cb)); // 创建一个Timer对象
        // 将Timer对象添加到表盘中
        int pos = (_tick + delay) % _capacity;
        _wheel[pos].push_back(pt);
        // 将Timer对象添加到哈希表中方便管理
        _timers[id] = WeakTask(pt); // 构造一个匿名的WeakTask对象然后再赋值,简化为直接构造
        // 当Timer对象释放的时候需要将其对应的信息从unordered_map中移除,绑定回调函数
        pt->SetRelease(std::bind(&TimeWheel::RemoveTimer, this, id));
    }
    void RefreshTimer(uint64_t id)
    {
        // 通过id寻找到对应的weak_ptr从而形成一个新的shared_ptr对象存储到表盘中,此时之前的shared_ptr对象释放时候Timer对象就不会被析构了,这样就达到了更新生命周期的目的
        auto it = _timers.find(id);
        if (it == _timers.end())
        {
            return;
        }
        // 说明寻找到了相应的weak_ptr
        PtrTask pt = it->second.lock();
        int pos = (_tick + pt->GetTimeout()) % _capacity;
        _wheel[pos].push_back(pt);
    }
    void TimerCancel(uint64_t id)
    {
        auto it = _timers.find(id);
        if (it == _timers.end())
        {
            return;
        }
        PtrTask pt = it->second.lock();
        if(pt) pt->Cancel();//取消该任务
    }
    void RunTimerTask()
    {
        _tick = (_tick + 1) % _capacity;
        _wheel[_tick].clear();
    }
};

Buffer模块

该模块是用来存储从socket套接字接收到的数据和需要发送的数据

思想:使用vector来管理一片内存空间,vector可以更好的处理像图片、二进制文件这种数据(string则会有遇到截至的弊端),然后使用两个下标指针分别标记读位置和写位置,进而维护这块缓冲区。

读入数据:直接从读下标所指向的位置开始读取,但是读取内容的大小不能超过可读的数据大小,并且需要在读之后更新可读数据大小。

写入数据:指向哪里就从哪个位置开始写入,但需要判断是否有足够的剩余空间写入新数据,如果读下标之后没有足够的剩余空间但是总体剩余空间足够,我们就需要挪动未读数据到数组起始位置从而方便新数据的写入;如果总体的剩余空间不足那就需要扩容,扩容的时候并不需要挪动原有的可读数据,而是直接扩容直到写下标后的空间大小可以容纳新数据。

#define DefaultBufferSize 1024
class Buffer {
private:
    std::vector _buffer;  // 使用vector来充当缓冲区
    size_t _reader_idx;         // 读下标
    size_t _writer_idx;         // 写下标
public:
    Buffer() {
        _buffer.resize(DefaultBufferSize);
        _reader_idx = 0;
        _writer_idx = 0;
    }
    char *Begin() { return &*_buffer.begin(); }
    // 获取当前读出起始地址
    char *ReadPosition() { return Begin() + _reader_idx; }
    // 获取当前写入起始地址
    char *WritePosition() { return Begin() + _writer_idx; }

    // 获取缓冲区前部空闲空间大小
    size_t HeadIdleSize() { return _reader_idx; }
    // 获取缓冲区后部空闲空间大小
    size_t TailIdleSize() { return _buffer.size() - _writer_idx; }

    // 获取可读数据大小
    size_t ReadAbleSize() { return _writer_idx - _reader_idx; }

    // 将读下标向后移动特定距离
    void MoveReadOffset(size_t len) {
        assert(len <= ReadAbleSize());  // 确保读取数据不越界
        _reader_idx += len;
    }
    // 将写下标向后移动特定距离
    void MoveWriteOffset(size_t len) {
        assert(len <= TailIdleSize());  // 确保能够放得下数据
        _writer_idx += len;
    }
    // 确保空间足够(如果空间足够就将数据前移,不够就直接扩容)
    void EnsureEnoughSpace(size_t len) {
        if (len <= TailIdleSize())  // 缓冲区后部的空闲空间足够
            return;
        if (len <= HeadIdleSize() + TailIdleSize())  // 缓冲区总体空闲空间足够
        {
            // 将数据拷贝到数组的起始位置
            std::copy(ReadPosition(), ReadPosition() + ReadAbleSize(), Begin());
            _writer_idx = ReadAbleSize();
            _reader_idx = 0;  // 注意_writer_idx与_reader_idx顺序!
            return;
        }
        // 说明数组中空闲区域的位置不足,此时直接扩容但不移动数据
        _buffer.resize(_buffer.size() + len);
        return;
    }
    // 写入数据
    void Write(const void *data, size_t len) {
        EnsureEnoughSpace(len);
        char *str = (char *)data;
        std::copy(str, str + len, WritePosition());
    }
    void WriteString(const std::string &str) { Write(&str[0], str.size()); }
    void WriteBuffer(Buffer &buffer) {
        Write(buffer.ReadPosition(), buffer.ReadAbleSize());  //?
    }
    void WriteAndPush(const void *data, size_t len) {
        Write(data, len);
        MoveWriteOffset(len);
    }
    void WriteStringAndPush(const std::string &str) {
        WriteString(str);
        MoveWriteOffset(str.size());
    }
    void WriteBufferAndPush(Buffer &buffer) {
        WriteBuffer(buffer);
        MoveWriteOffset(buffer.ReadAbleSize());
    }
    // 读取数据
    void Read(void *buffer, size_t len) {
        assert(len <= ReadAbleSize());
        std::copy(ReadPosition(), ReadPosition() + len, (char *)buffer);
    }
    void ReadAndPop(void *buf, size_t len) {
        Read(buf, len);
        MoveReadOffset(len);
    }
    std::string ReadAsString(size_t len) {
        assert(len <= ReadAbleSize());
        std::string str;
        str.resize(len);
        Read(&str[0], len);  //?
        return str;
    }
    std::string ReadAsStringAndPop(size_t len) {
        std::string str = ReadAsString(len);
        MoveReadOffset(len);
        return str;
    }

    char *GetCRLF() {
        char *res = (char *)memchr(ReadPosition(), '
', ReadAbleSize());
        return res;
    }
    std::string GetLine() {
        char *crlf = GetCRLF();
        if (crlf) {
            size_t len = crlf - ReadPosition() + 1;  // 将
也读出来
            return ReadAsStringAndPop(len);
        }
        return "";
    }
    std::string GetLineAndPop() {
        std::string line = GetLine();
        MoveReadOffset(line.size());
        return line;
    }
};

Socket模块

对socket套接字一系列操作的封装,方便后续使用

class Socket {
private:
    int _socketfd;

public:
    Socket()
            : _socketfd(-1) {}
    Socket(int fd)
            : _socketfd(fd) {}
    ~Socket() { Close(); }
    // 创建socket
    bool Create() {
        _socketfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (_socketfd < 0) {
            LOG_ERROR("SOCKET CREATE ERROR");
            return false;
        }
        return true;
    }
    // 绑定ip和端口
    bool Bind(const std::string &ip, uint16_t port) {
        struct sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        inet_pton(AF_INET, ip.c_str(), &addr.sin_addr);
        if (bind(_socketfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
            LOG_ERROR("SOCKET BIND ERROR");
            return false;
        }
        return true;
    }
    // 设置为监听模式
    bool Listen(int backlog = DefaultBackLog) {
        int ret = listen(_socketfd, backlog);
        if (ret < 0) {
            LOG_ERROR("SOCKET LISTEN ERROR");
            return false;
        }
        return true;
    }
    // 建立连接
    bool Connect(const std::string &ip, uint16_t port) {
        struct sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        inet_pton(AF_INET, ip.c_str(), &addr.sin_addr);
        int ret = connect(_socketfd, (struct sockaddr *)&addr, sizeof(addr));
        if (ret < 0) {
            LOG_ERROR("SOCKET CONNECT ERROR");
            return false;
        }
        return true;
    }
    // 获取新连接并返回新的连接描述符
    int Accept() {
        // 不关心客户端的ip和端口信息
        int newfd = accept(_socketfd, nullptr, nullptr);
        if (newfd < 0) {
            if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {
                LOG_DEBUG("SOCKET ACCEPT ERROR AGAIN");
            } else {
                LOG_ERROR("SOCKET ACCEPT ERROR");
            }
        }
        return newfd;
    }
    ssize_t Recv(void *buffer, size_t len, int flag = 0) {
        ssize_t ret = recv(_socketfd, buffer, len, flag);
        if (ret < 0)  // 出错或者对端关闭连接
        {
            if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {
                LOG_DEBUG("SOCKET RECV ERROR AGAIN");
                return -1;
            } else {
                LOG_ERROR("SOCKET RECV ERROR errno=%d(%s)", errno, strerror(errno));
                return -2;
            }
        }
        return ret;
    }
    ssize_t NonBlockRecv(void *buffer, size_t len) { return Recv(buffer, len, MSG_DONTWAIT); }
    ssize_t Send(const void *buffer, size_t len, int flag = 0) {
        ssize_t ret = send(_socketfd, buffer, len, flag);
        if (ret <= 0)  // 出错或者对端关闭连接
        {
            if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
                return 0;
            LOG_ERROR("SOCKET SEND ERROR errno=%d(%s)", errno, strerror(errno));
            return -1;
        }
        return ret;
    }
    ssize_t NonBlockSend(void *buffer, size_t len) { return Send(buffer, len, MSG_DONTWAIT); }
    bool CreateServer(uint16_t port, const std::string &ip = "0.0.0.0", bool flag = 0) {
        // 1.创建socket
        if (Create() == false)
            return false;
        // 复用地址
        ReuseAddress();
        // 2.绑定ip和端口
        if (Bind(ip, port) == false)
            return false;
        // 3.设置为监听模式
        if (Listen() == false)
            return false;
        // 设置套接字为非阻塞
        // if (flag)
        // SetNonBlock();
        return true;
    }
    bool CreateClient(uint16_t port, const std::string &ip) {
        // 1.创建socket
        if (Create() == false)
            return false;
        // 无需手动绑定ip和端口号,系统自动分配从而防止端口号冲突
        // 2.连接服务器
        if (Connect(ip, port) == false)
            return false;
        return true;
    }
    bool Close() {
        if (_socketfd != -1) {
            close(_socketfd);
            _socketfd = -1;
        }
        return true;
    }
    void ReuseAddress() {
        int opt = 1;
        setsockopt(_socketfd, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt));
        opt = 1;
        setsockopt(_socketfd, SOL_SOCKET, SO_REUSEPORT, (void *)&opt, sizeof(opt));
    }
    void SetNonBlock() {
        int flags = fcntl(_socketfd, F_GETFL, 0);
        fcntl(_socketfd, F_SETFL, flags | O_NONBLOCK);
    }
    int Fd() { return _socketfd; }
};

Channel模块

该模块是方便我们对一个连接进行监控操作,并设置对应事件触发后的回调函数。

关于EPOLLHUP、EPOLLDRHUP

EPOLLHUP表示文件描述符上发生了挂起事件,一般会因为对端正常关闭连接但另一端却仍然对该文件描述符进行操作而触发。

EPOLLDRHUP表示对端已关闭写操作,或连接半关闭,一般会因为操作的对应文件描述符对应的连接发送了 FIN 包(正常关闭)或关闭了写通道(半关闭状态)而触发。

class Channel {
    using EventCallBack = std::function;

private:
    int _fd;                  // 该Channel所绑定的文件描述符
    EventLoop *_loop;         // 该Channel所属的事件循环器
    uint32_t _events;         // 监控的事件
    uint32_t _revents;        // 发生的事件
    EventCallBack _read_cb;   // 读事件被触发的回调函数
    EventCallBack _write_cb;  // 写事件被触发的回调函数
    EventCallBack _error_cb;  // 错误事件被触发的回调函数
    EventCallBack _close_cb;  // 断开事件被触发的回调函数
    EventCallBack _event_cb;  // 任意事件被触发的回调函数
public:
    Channel(int fd, EventLoop *loop)
            : _fd(fd)
            , _loop(loop)
            , _events(0)
            , _revents(0) {}
    // 获取文件描述符
    int Fd() { return _fd; }
    // 获取监控的事件
    uint32_t Events() { return _events; }
    // 被触发的事件
    void SetREvents(uint32_t revents) { _revents = revents; }
    // 设置读事件的回调函数
    void SetReadCallback(EventCallBack read_cb) { _read_cb = read_cb; }
    // 设置写事件的回调函数
    void SetWriteCallback(EventCallBack write_cb) { _write_cb = write_cb; }
    // 设置错误事件的回调函数
    void SetErrorCallback(EventCallBack error_cb) { _error_cb = error_cb; }
    // 设置断开事件的回调函数
    void SetCloseCallback(EventCallBack close_cb) { _close_cb = close_cb; }
    // 设置任意事件的回调函数
    void SetEventCallback(EventCallBack event_cb) { _event_cb = event_cb; }
    // 是否可读
    bool ReadAble() { return _events & EPOLLIN; }
    // 是否可写
    bool WriteAble() { return _events & EPOLLOUT; }
    // 开启读事件监控
    void EnableRead() {
        _events |= (EPOLLIN | EPOLLRDHUP);
        Update();
    }
    // 开启写事件监控
    void EnableWrite() {
        _events |= EPOLLOUT;
        Update();
    }
    // 关闭读事件监控
    void DisableRead() {
        _events &= ~EPOLLIN;
        Update();
    }
    // 关闭写事件监控
    void DisableWrite() {
        _events &= ~EPOLLOUT;
        Update();
    }
    // 关闭所有事件监控
    void DisableAll() {
        _events = 0;
        Update();
    }
    // 从EventLoop中移除该Channel
    void Remove();
    void Update();
    void Handler() {
        if ((_revents & EPOLLIN) || (_revents & EPOLLPRI) || (_revents & EPOLLRDHUP)) {
            if (_read_cb)
                _read_cb();
            // 事件处理完毕后刷新活跃度
        }
        // 有可能释放连接的事件,一次只处理一个(保证安全)
        if (_revents & EPOLLOUT) {
            if (_write_cb)
                _write_cb();
            // 事件处理完毕后刷新活跃度
        }
        if (_revents & EPOLLERR) {
            if (_error_cb)
                _error_cb();
        }
        if (_revents & EPOLLHUP) {
            if (_close_cb)
                _close_cb();
        }
        if (_event_cb) {
            _event_cb();
        }
    }
};

Poller模块

每一个连接对应的Channel都会被添加到EventLoop进行事件监控,Poller模块就是为了让EventLoop能够监视该从属线程中的所有连接事件。

Poller模块功能:1.添加/修改描述符的事件监控 2.移除描述符的事件监控

处理逻辑:

1.Channel设置对应连接的描述符需要被监控的事件从而让Poller进行监控

2.当对应的文件描述符就绪时,通过文件描述符和Channel的映射关系来寻找到对应的Channel对象并调用对应的回调函数进行事件处理

#define MAXEVENTS 1024
class Poller {
private:
    int _epfd;
    struct epoll_event _events[MAXEVENTS];
    std::unordered_map _channels;

private:
    void Update(Channel *channel, int op) {
        struct epoll_event ev;
        ev.data.fd = channel->Fd();
        ev.events = channel->Events();
        if (epoll_ctl(_epfd, op, channel->Fd(), &ev) < 0) {
            if (op & EPOLL_CTL_ADD)
                LOG_ERROR("EPOLL CTL ADD ERROR");
            LOG_ERROR("EPOLL CTL ERROR");
        }
    }
    bool CheckChannel(Channel *channel) {
        int fd = channel->Fd();
        auto it = _channels.find(fd);
        if (it == _channels.end()) {
            return false;
        }
        return true;
    }

public:
    Poller() {
        _epfd = epoll_create(MAXEVENTS);
        if (_epfd < 0) {
            LOG_ERROR("EPOLL CREATE ERROR");
        }
    }
    ~Poller() { close(_epfd); }
    void UpdateEvent(Channel *channel) {
        int fd = channel->Fd();
        if (fd < 0)
            return;
        bool exists = CheckChannel(channel);
        uint32_t evs = channel->Events();
        if (evs == 0) {
            if (exists) {
                // 删除channel
                Update(channel, EPOLL_CTL_DEL);
                _channels.erase(fd);
            }
            return;
        }
        if (!exists) {
            // 新增channel
            Update(channel, EPOLL_CTL_ADD);
            _channels[fd] = channel;
        } else {
            // 修改channel
            Update(channel, EPOLL_CTL_MOD);
        }
        // if (CheckChannel(channel) == false) {
        //     // 新增channel

        //     Update(channel, EPOLL_CTL_ADD);
        //     _channels[channel->Fd()] = channel;
        // } else {
        //     // 修改channel
        //     Update(channel, EPOLL_CTL_MOD);
        // }
    }
    void RemoveEvent(Channel *channel) {
        if (CheckChannel(channel) == false) {
            return;
        }
        Update(channel, EPOLL_CTL_DEL);
        _channels.erase(channel->Fd());
    }
    void Poll(std::vector *actvie) {
        int nfds = epoll_wait(_epfd, _events, MAXEVENTS, -1);
        if (nfds < 0) {
            if (errno == EINTR) {
                return;
            }
            LOG_ERROR("EPOLL WAIT ERROR,%s
", strerror(errno));
            abort();
        }
        for (int i = 0; i < nfds; ++i) {
            int fd = _events[i].data.fd;
            auto it = _channels.find(fd);
            assert(it != _channels.end());
            Channel *channel = it->second;
            channel->SetREvents(_events[i].events);
            actvie->push_back(channel);
        }
    }
};

EventLoop模块

我们的思想是one thread one loop,一个从属线程对应一个EventLoop对象,从属线程需要管理分配到该线程中的所有连接及其事件处理。

为了让该连接的所有事件处理均在其对应的EventLoop线程中进行,我们使用将所有对连接的操作进行封装并添加到任务队列的方式来完成,不使用加锁是因为大量连接对应的大量I/O事件如果都加锁,那么将会导致效率下降。

EventLoop处理流程:

1.对所管理的连接进行事件监控

2.如果有描述符对应的事件被触发了就直接进行处理

3.所有的就绪事件完成之后就去查看任务队列中是否有任务,如果有任务就执行。

但是EventLoop线程可能因为连接迟迟没有事件触发而导致阻塞,从而使任务队列中的任务迟迟得不到执行!因此我们将eventfd也添加到监视之中,如果任务队列有任务那么eventfd可读就会被触发。

class EventLoop {
private:
    using Functor = std::function;
    std::thread::id _thread_id;               // 事件循环所属线程的id
    int _event_fd;                            // 用于唤醒事件循环的文件描述符
    Poller _poller;                           // 事件监控
    std::unique_ptr _event_channel;  // 用于监听_event_fd的Channel
    std::vector _task;               // 任务队列
    std::mutex _mutex;
    TimeWheel _time_wheel;

public:
    static int CreateEventFd() {
        int evtfd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
        if (evtfd < 0) {
            LOG_ERROR("EVENTFD CREATE ERROR");
            abort();
        }
        return evtfd;
    }

public:
    EventLoop()
            : _thread_id(std::this_thread::get_id())
            , _event_fd(CreateEventFd())
            , _poller()
            , _event_channel(new Channel(_event_fd, this))
            , _time_wheel(this) {
        _event_channel->SetReadCallback(std::bind(&EventLoop::ReadEventFd, this));
        _event_channel->EnableRead();
    }
    void ReadEventFd()  // 读取_event_fd中的数据,防止一直触发可读事件
    {
        uint64_t value;
        ssize_t ret = read(_event_fd, &value, sizeof(value));
        if (ret < 0) {
            if (errno == EAGAIN)
                return;

            LOG_ERROR("EVENTFD READ ERROR");
            abort();
        }
    }
    void WeakUpEventFd()  // 写入数据到_event_fd,唤醒事件循环
    {
        uint64_t value = 1;
        int ret = write(_event_fd, &value, sizeof(value));
        if (ret < 0) {
            if (errno == EAGAIN)
                return;
            LOG_ERROR("EVENTFD WRITE ERROR");
            abort();
        }
    }
    // 事件监控 -> 就绪事件处理 -> 执行任务
    void Start() {
        while (true) {
            std::vector actives;
            _poller.Poll(&actives);
            for (auto channel : actives) { channel->Handler(); }
            RunAllTasks();
        }
    }
    void RunAllTasks() {
        std::vector tasks;
        {
            std::unique_lock lock(_mutex);
            tasks.swap(_task);
        }
        if (tasks.empty())
            return;
        for (const Functor &task : tasks) { task(); }
    }
    void RunInLoop(const Functor cb) {
        if (IsInLoop()) {
            return cb();
        }
        return QueueInLoop(cb);
    }
    // 将任务压入任务队列
    void QueueInLoop(const Functor cb) {
        {
            std::unique_lock lock(_mutex);
            _task.push_back(cb);
        }
        // 有可能因为没有事件触发导致epoll一直等待,因此我们需要使用EventFd唤醒它
        // 使用EventFd写入数据来触发可读事件
        WeakUpEventFd();
    }
    bool IsInLoop()  // 判断是否属于EventLoop线程
    {
        return _thread_id == std::this_thread::get_id();
    }
    void AssertInLoop() { return assert(_thread_id == std::this_thread::get_id()); }
    void UpdateEvent(Channel *channel)  // 更新Channel事件
    {
        _poller.UpdateEvent(channel);
    }
    void RemoveEvent(Channel *channel)  // 移除Channel事件
    {
        _poller.RemoveEvent(channel);
    }
    void TimerAdd(uint64_t id, uint32_t delay, const TaskFunc &cb) { _time_wheel.TimerAdd(id, delay, cb); }
    void TimerRefresh(uint64_t id) { _time_wheel.TimerRefresh(id); }
    void TimerCancel(uint64_t id) { _time_wheel.TimerCancel(id); }
    bool TimerCheck(uint64_t id) { return _time_wheel.TimerCheck(id); }
    bool HasTimer(uint64_t id) { return _time_wheel.TimerCheck(id); }
};

EventLoop模块内部关系图

Connection模块

Connection模块是对单个连接的全面管理,对连接的所有操作都是通过Connection对象完成。

对连接管理主要分为下面几个方面:

1.对连接套接字的管理,能够进行套接字操作

2.对连接事件的管理,方便进行监听和采取对应的回调函数进行处理

3.对连接接收和发送缓冲区的管理,可以接收连接对端发送的数据和向对端发送数据

4.协议上下文的管理,记录请求数据的处理过程(上层从接收缓冲区拿去数据并进行处理,如果数据不完整则会继续等待下一次数据直到数据完整在进行处理)

5.对连接回调函数的管理,包括连接建立回调函数(连接建立后需要对连接进行什么处理,由组件使用者决定)、消息到达回调函数(从对应连接接收到数据后应该如何处理,由组件使用者决定)、连接关闭回调函数(连接关闭的时候应该另外做什么处理,又组件使用者决定)、任何事件触发回调函数(任意事件触发了是否还需要处理什么业务,由组件使用者决定)。

typedef enum { CONNECTED, CONNECTING, DISCONNECTED, DISCONNECTING } ConnectionStatus;
class Connection : public std::enable_shared_from_this {
    using PTRConnection = std::shared_ptr;

private:
    uint64_t _conn_id;              // 连接的id,用来唯一标识该连接
    uint64_t _timer_id;             // 定时器的id,用来唯一标识定时器,为了方便我们将其与_conn_id的值设置一致
    bool _enable_inactive_release;  // 是否启用不活跃连接释放
    int _sockfd;                    // 连接对应的文件描述符
    EventLoop *_loop;               // 连接关联的对应EventLoop线程
    ConnectionStatus _conn_status;  // 连接的当前状态
    Socket _socket;                 // 管理连接套接字
    Channel _channel;               // 管理连接事件
    Buffer _in_buffer;              // 接收缓冲区
    Buffer _out_buffer;             // 发送缓冲区
    Any _context;                   // 请求的上下文
    // 由组件使用者自定义的回调函数
    using ConnectionCallback = std::function;
    using MessageCallback = std::function;
    using CloseCallback = std::function;
    using AnyEventCallback = std::function;
    ConnectionCallback _conn_cb;  // 连接建立回调函数
    MessageCallback _msg_cb;      // 消息到达回调函数
    CloseCallback _close_cb;      // 连接关闭回调函数
    AnyEventCallback _event_cb;   // 任何事件触发回调函数
    // 组件内关闭连接所用的回调函数,服务器将所有连接管理起来,当连接关闭时需要将其从服务器的连接列表中移除
    CloseCallback _server_close_cb;

private:
    // 处理从socket套接字读取数据事件,需要将数据从socket中取出然后放入到接收缓冲区中
    void HandleRead() {
        char buffer[65536];
        int ret = _socket.NonBlockRecv(buffer, sizeof(buffer));
        if (ret <= 0) {
            if (ret == 0)
                return Release();
            if (ret == -1)
                return;
            return ShutdownInLoop();
        }
        // 将读取到的数据放入到接收缓冲区中
        buffer[ret] = '';
        _in_buffer.WriteAndPush(buffer, ret);
        // 调用消息到达回调函数
        if (_msg_cb)
            _msg_cb(shared_from_this(), &_in_buffer);
    }
    // 处理向socket套接字写入数据事件,需要将发送缓冲区中的数据发送到socket中
    void HandleWrite() {
        ssize_t ret = _socket.NonBlockSend(_out_buffer.ReadPosition(), _out_buffer.ReadAbleSize());
        if (ret < 0) {
            if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {
                // 无法发送数据,等待下一次写事件触发
                return;
            }
            // 发送数据出错,关闭连接
            return Release();
        }
        _out_buffer.MoveReadOffset(ret);
        // 判断发送缓冲区中是否还有数据需要发送
        if (_out_buffer.ReadAbleSize() == 0) {
            // 关闭写事件的监控,否则会一致触发写事件因为存在空闲区域
            _channel.DisableWrite();
            if (_conn_status == DISCONNECTING) {
                // 说明是用户调用了关闭连接操作,并且数据已经发送完毕,可以关闭连接了
                return Release();
            }
        }
    }
    void HandleClose() {
        // 处理剩余未处理数据
        if (_in_buffer.ReadAbleSize() > 0) {
            _msg_cb(shared_from_this(), &_in_buffer);
        }
        // 调用EventLoop内释放函数
        return Release();
    }
    void HandleError() { return HandleClose(); }
    void HandleEvent() {
        // 刷新事件活跃度
        if (_enable_inactive_release == true)
            _loop->TimerRefresh(_timer_id);
        // 调用用户设置的任意事件回调函数
        if (_event_cb)
            _event_cb(shared_from_this());
    }
    void EstablishInLoop() {
        // 1.修改连接状态 2.启动读事件 3.调用连接建立回调函数
        _conn_status = CONNECTED;
        _channel.EnableRead();
        if (_conn_cb)
            _conn_cb(shared_from_this());
    }
    // 真正的释放连接
    void ReleaseInLoop() {
        // 1.修改连接状态 2.移除连接的事件监控 3.关闭socket文件描述符 4.如果有定时器就将其移除 5.调用连接关闭回调函数
        // 6.调用服务器的关闭连接回调函数
        if (_conn_status == DISCONNECTED)
            return;
        _conn_status = DISCONNECTED;
        _channel.Remove();
        _socket.Close();
        if (_loop->HasTimer(_timer_id))
            _loop->TimerCancel(_timer_id);
        if (_close_cb)
            _close_cb(shared_from_this());
        if (_server_close_cb) {  // _server_close_cb
            _server_close_cb(shared_from_this());
        }
        // 在这里打印
    }
    // 不是实际的发送,而是将数据放入发送缓冲区并且启动写事件监控
    void SendInLoop(const char *data, size_t len) {
        // 1.将数据放入发送缓冲区 2.启动写事件监控
        // 防止数据是临时数据,及时将数据进行保存
        Buffer buf;
        buf.WriteAndPush(data, len);
        _out_buffer.WriteBufferAndPush(buf);
        _channel.EnableWrite();
    }
    // 不是实际的关闭连接,而是修改连接状态并且等待发送缓冲区的数据发送完毕和接收缓冲区的数据处理完毕后再关闭连接
    void ShutdownInLoop() {
        // 1.设置连接状态 2.处理接收缓冲区数据 3.处理发送缓冲区数据
        if (_conn_status == DISCONNECTING || _conn_status == DISCONNECTED)
            return;
        _conn_status = DISCONNECTING;
        if (_in_buffer.ReadAbleSize() > 0)
            _msg_cb(shared_from_this(), &_in_buffer);
        if (_out_buffer.ReadAbleSize() == 0)
            Release();  // 说明发送缓冲区没有数据可以发送,直接关闭连接
        else
            _channel.EnableWrite();  // 说明发送缓冲区还有数据需要发送,启动写事件监控
    }
    // 启动非活跃连接释放定时器
    void EnableInactiveReleaseInLoop(int sec) {
        // 1.修改对应的标志位 2.如果存在定时器就刷新 3.如果不存在就直接新增
        _enable_inactive_release = true;
        if (_loop->TimerCheck(_timer_id)) {
            _loop->TimerRefresh(_timer_id);
        } else {
            _loop->TimerAdd(_timer_id, sec, std::bind(&Connection::ReleaseInLoop, this));
        }
    }
    void CancelInactiveReleaseInLoop() {
        // 1.修改对应的标志位 2.如果存在定时器就取消
        _enable_inactive_release = false;
        if (_loop->TimerCheck(_timer_id)) {
            _loop->TimerCancel(_timer_id);
        }
    }
    void UpgradeInLoop(
        const Any &context, const ConnectionCallback &conn_cb, const MessageCallback &msg_cb,
        const CloseCallback &close_cb, const AnyEventCallback &event_cb) {
        _context = context;
        _conn_cb = conn_cb;
        _msg_cb = msg_cb;
        _close_cb = close_cb;
        _event_cb = event_cb;
    }

public:
    Connection(EventLoop *loop, uint64_t conn_id, int sockfd)
            : _conn_id(conn_id)
            , _timer_id(conn_id)
            , _enable_inactive_release(false)
            , _sockfd(sockfd)
            , _loop(loop)
            , _conn_status(CONNECTING)
            , _socket(sockfd)
            , _channel(sockfd, loop) {
        _channel.SetReadCallback(std::bind(&Connection::HandleRead, this));
        _channel.SetWriteCallback(std::bind(&Connection::HandleWrite, this));
        _channel.SetCloseCallback(std::bind(&Connection::HandleClose, this));
        _channel.SetErrorCallback(std::bind(&Connection::HandleError, this));
        _channel.SetEventCallback(std::bind(&Connection::HandleEvent, this));
    }
    ~Connection() { LOG_INFO("Connection %lu destructed", _conn_id); }
    int Fd() { return _sockfd; }
    uint64_t GetConnId() { return _conn_id; }
    bool Connected() { return _conn_status == CONNECTED; }
    void SetContext(const Any &context) { _context = context; }
    Any *GetContext() { return &_context; }
    void SetConnectionCallback(const ConnectionCallback &cb) { _conn_cb = cb; }
    void SetMessageCallback(const MessageCallback &cb) { _msg_cb = cb; }
    void SetCloseCallback(const CloseCallback &cb) { _close_cb = cb; }
    void SetAnyEventCallback(const AnyEventCallback &cb) { _event_cb = cb; }
    void SetSvrCloseCallback(const CloseCallback &cb) { _server_close_cb = cb; }
    void Established() { _loop->RunInLoop(std::bind(&Connection::EstablishInLoop, this)); }
    void Send(const char *data, size_t len) {
        _loop->RunInLoop(std::bind(&Connection::SendInLoop, this, data, len));
    }
    void ShutDown()  // 关闭连接,但需要检查是否有数据未发送完毕
    {
        _loop->RunInLoop(std::bind(&Connection::ShutdownInLoop, this));
    }
    // 确保连接释后事件事件不在会被触发,防止前面的事件为定时器事件然后导致连接被释放从而影响后面连接事件触发时候访问非法内存
    void Release() { _loop->QueueInLoop(std::bind(&Connection::ReleaseInLoop, this)); }
    void EnableInactiveRelease(int sec) {
        _loop->RunInLoop(std::bind(&Connection::EnableInactiveReleaseInLoop, this, sec));
    }
    void CancelInactiveRelease() {
        _loop->RunInLoop(std::bind(&Connection::CancelInactiveReleaseInLoop, this));
    }
    // 协议切换——重置上下文和回调函数,该函数必须在对应的EventLoop线程中调用
    // 防备新事件触发时候切换任务还未执行,从而导致数据和协议不对等!
    void Upgrade(
        const Any &context, const ConnectionCallback &conn_cb, const MessageCallback &msg_cb,
        const CloseCallback &close_cb, const AnyEventCallback &event_cb) {
        _loop->AssertInLoop();
        _loop->RunInLoop(
            std::bind(&Connection::UpgradeInLoop, this, context, conn_cb, msg_cb, close_cb, event_cb));
    }
};

Acceptor模块

该模块负责管理监听套接字。主要功能是创建监听套接字、启动对应描述符的可读事件、处理新达到的连接、对新到达的连接进行处理。

class Acceptor {
private:
    Socket _listenfd;
    EventLoop *_loop;
    Channel _channel;

    using AccptorCallback = std::function;
    AccptorCallback _accept_cb;

private:
    int CreateSvrFd(uint16_t port) {
        bool ret = _listenfd.CreateServer(port);
        assert(ret == true);
        return _listenfd.Fd();
    }
    void HandleRead() {
        while (true) {
            //_listenfd.SetNonBlock();
            int newfd = _listenfd.Accept();
            if (newfd < 0) {
                if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {
                    // 没有新的连接请求
                    break;
                }
                LOG_ERROR("ACCEPT ERROR,%s", strerror(errno));
                break;
            }
            if (_accept_cb)
                _accept_cb(newfd);
        }
    }

public:
    Acceptor(EventLoop *loop, uint16_t port)
            : _listenfd(CreateSvrFd(port))
            , _loop(loop)
            , _channel(_listenfd.Fd(), loop) {
        _channel.SetReadCallback(std::bind(&Acceptor::HandleRead, this));
    }
    void SetAcceptCallback(AccptorCallback cb) { _accept_cb = cb; }
    // Listen函数是确保在设置好回调函数后才开始监听连接请求,防止因为没有设置好回调函数而错过连接请求并且会有资源浪费(新的连接没有close)
    void Listen() { _channel.EnableRead(); }
};

LoopThread模块

该模块是为了更好的实现one thread one loop思想,让EventLoop和线程一一对应。

为什么不采用先创建EventLoop对象然后传入对应的从属线程中?

C++ 的“传入线程”不等于“安全迁移”:要么需要移动/拷贝对象(很多包含 mutex、fd、unique_ptr 的类型不可拷贝/不宜移动),要么传指针/引用共享同一个对象(那就必须额外保证生命周期、发布/可见性、并发访问不数据竞争)。这些复杂度在 reactor 里一般不值得。因此我们使用先创建线程,然后在线程函数内执行创建EventLoop对象的方式,这样更可控。

class LoopThread {
private:
    std::mutex _mutex;              // 互斥锁
    std::condition_variable _cond;  // 条件变量
    EventLoop *_loop;               // 事件循环指针
    std::thread _thread;            // 线程对象 新线程的入口函数
public:
    void ThreadFunc() {
        EventLoop loop;
        {
            std::unique_lock lock(_mutex);
            _loop = &loop;
            // 有可能_loop还没有实例化就GetLoop被调用了,因此需要通知其创建成功
            _cond.notify_one();  // 通知创建成功
        }
        loop.Start();  // 启动事件循环
    }

public:
    LoopThread()
            : _loop(nullptr)
            , _thread(std::thread(&LoopThread::ThreadFunc, this)) {}
    EventLoop *GetLoop() {
        EventLoop *loop = nullptr;
        {
            std::unique_lock lock(_mutex);
            _cond.wait(lock, [&]() { return _loop != nullptr; });
            loop = _loop;
        }
        return loop;
    }
};

LoopThreadPool模块

该模块是针对LoopThread创建的一个线程池,可以对所有的从属线程LoopThread进行管理。主要功能是以主线程的 EventLoop 作为 base_loop,在需要多线程时创建若干 LoopThread(每个线程内部各自运行一个独立的 EventLoop),并通过 GetNextLoop() 以 RR 轮询的方式选择下一个从属 EventLoop,从而把新连接/任务分发到不同的事件循环线程上处理,实现 Reactor 的多线程扩展;当线程数为 0 时则退化为所有工作都由主 EventLoop 处理。

class LoopThreadPool {
private:
    int _thread_count;
    EventLoop *_base_loop;               // 主线程的事件循环
    std::vector _threads;  // 存储子线程对象
    std::vector _loops;     // 存储子线程的事件循环
    int _next_idx;                       // 下一个被选中的线程索引
public:
    LoopThreadPool(EventLoop *base_loop)
            : _base_loop(base_loop)
            , _thread_count(0)
            , _next_idx(0) {}
    void SetThreadCount(int thread_count) { _thread_count = thread_count; }
    // 创建从属线程
    void CreateDependedLoops() {
        if (_thread_count > 0) {
            _threads.resize(_thread_count);
            _loops.resize(_thread_count);
            for (int i = 0; i < _thread_count; ++i) {
                _threads[i] = new LoopThread();
                _loops[i] = _threads[i]->GetLoop();
            }
        }
    }
    // RR轮转获取下一个从属线程
    EventLoop *GetNextLoop() {
        if (_thread_count == 0) {
            return _base_loop;
        }
        _next_idx = (_next_idx + 1) % _thread_count;
        return _loops[_next_idx];
    }
};

TcpServer模块

TcpServer 把 TCP 的“接入、事件监听、线程分发、连接状态、收发缓冲、超时与生命周期”都收敛到 Reactor 框架里,而把协议/业务通过回调注入进去,从而实现高内聚的网络内核 + 可插拔的上层逻辑。

主从 Reactor 分工:主线程持有一个 base loop只负责监听/接入连接,accept 到新 fd 后把它“分发”给某个工作 EventLoop;工作线程(EventLoop)负责该连接后续所有 I/O 事件处理与回调执行。
连接抽象成 Connection 对象:每条 TCP 连接对应一个 Connection,内部把 “socket + channel(epoll 事件) +接收和发送缓冲区+ 状态机” 封装起来;读写/关闭/错误等事件被 Channel 触发后,转到 Connection 的HandleRead/HandleWrite/HandleClose等方法处理,避免业务层直接碰 epoll 细节。
回调驱动、业务与网络解耦:TcpServer 持有用户设置的连接建立/消息到达/连接关闭/任意事件回调(ConnectionCallback/MessageCallback/CloseCallback/AnyEventCallback),新连接建立时把这些回调注入到 Connection;这样框架只负责事件分发与资源管理,协议/业务逻辑由回调提供。
线程间任务投递靠 RunInLoop/QueueInLoop + eventfd 唤醒:EventLoop 里维护任务队列,跨线程调用通过 QueueInLoop 入队,并写 eventfd 唤醒 epoll_wait,保证“所有实际状态修改在所属 loop 线程执行”,减少并发数据竞争风险。
连接生命周期统一管理(可选超时释放):TcpServer 用 unordered_map 维护所有活跃连接;Connection 释放时通过 _server_close_cb 回调回到 TcpServer 删除记录;同时通过 TimeWheel实现“非活跃连接定时释放”(连接任何事件触发会 TimerRefresh),把超时控制也收敛到 loop 线程语义内。

class TcpServer {
    using PTRConnection = std::shared_ptr;

private:
    int _next_id;
    int _thread_count;
    int _timeout;  // 非活跃连接释放时间
    bool _enable_inactive_release;
    uint16_t _port;
    EventLoop _base_loop;
    Acceptor _acceptor;
    LoopThreadPool _pool;
    std::unordered_map _conns;
    using ConnectionCallback = std::function;
    using MessageCallback = std::function;
    using CloseCallback = std::function;
    using AnyEventCallback = std::function;
    ConnectionCallback _conn_cb;  // 连接建立回调函数
    MessageCallback _msg_cb;      // 消息到达回调函数
    CloseCallback _close_cb;      // 连接关闭回调函数
    AnyEventCallback _event_cb;   // 任何事件触发回调函数
    using Functor = std::function;

private:
    void RunAfterInLoop(const Functor &cb, uint32_t delay) {
        _next_id++;
        _base_loop.TimerAdd(0, delay, cb);
    }
    void HandleNewConnection(int sockfd) {
        uint64_t conn_id = _next_id++;
        EventLoop *loop = _pool.GetNextLoop();
        PTRConnection conn(new Connection(loop, conn_id, sockfd));
        conn->SetConnectionCallback(_conn_cb);
        conn->SetMessageCallback(_msg_cb);
        conn->SetCloseCallback(_close_cb);
        conn->SetAnyEventCallback(_event_cb);
        conn->SetSvrCloseCallback(std::bind(&TcpServer::RemoveConnectionInLoop, this, std::placeholders::_1));
        if (_enable_inactive_release)
            conn->EnableInactiveRelease(_timeout);
        _conns.emplace(conn_id, conn);
        conn->Established();
    }
    void RemoveConnectionInLoop(const PTRConnection &conn) {
        LOG_DEBUG("RemoveConnectionInLoop called");
        uint64_t id = conn->GetConnId();
        if (_conns.find(id) == _conns.end()) {
            return;
        }
        _conns.erase(id);
    }
    void RemoveConnection(const PTRConnection &conn) {
        LOG_DEBUG("RemoveConnection called");
        _base_loop.RunInLoop(std::bind(&TcpServer::RemoveConnectionInLoop, this, conn));
    }

public:
    TcpServer(uint16_t port)
            : _next_id(0)
            , _thread_count(0)
            , _timeout(0)
            , _enable_inactive_release(false)
            , _port(port)
            , _base_loop()
            , _acceptor(&_base_loop, port)
            , _pool(&_base_loop) {
        _acceptor.SetAcceptCallback(std::bind(&TcpServer::HandleNewConnection, this, std::placeholders::_1));
    }
    void SetThreadCount(int thread_count) {
        _thread_count = thread_count;
        _pool.SetThreadCount(thread_count);
    }
    void SetInactiveReleaseTime(int timeout) {
        _enable_inactive_release = true;
        _timeout = timeout;
    }
    void SetConnectionCallback(const ConnectionCallback &cb) { _conn_cb = cb; }
    void SetMessageCallback(const MessageCallback &cb) { _msg_cb = cb; }
    void SetCloseCallback(const CloseCallback &cb) { _close_cb = cb; }
    void SetAnyEventCallback(const AnyEventCallback &cb) { _event_cb = cb; }
    void EnableInactiveRelease(int timeout) {
        _timeout = timeout;
        _enable_inactive_release = true;
    }
    // 添加定时任务
    void RunAfter(const Functor &cb, uint32_t delay) {
        _base_loop.RunInLoop(std::bind(&TcpServer::RunAfterInLoop, this, cb, delay));
    }
    void Start() {
        LOG_INFO("Server starting...");
        _pool.CreateDependedLoops();
        _acceptor.Listen();
        _base_loop.Start();
    }
};

HTTP模块

http模块主要分为以下几块:

1.Util

工具类集合:提供 URL 编解码、字符串分割、文件读写、状态码描述(StatusDesc)、根据后缀推导 MIME(ExternMime)、判断路径/文件类型(IsDir/IsRegular)、以及路径合法性校验(ValidPath,用于防目录穿越)。
2.HttpRequest

HTTP 请求数据模型:保存方法/URL/版本/正文、请求头(_headers)、查询参数(_params),并提供 ContentLength()、Close() 等便捷判断;_matches 用于路由正则匹配后提取分组结果。
3.HttpResponse
HTTP 响应数据模型:保存状态码、重定向信息、响应正文、响应头;提供 SetContent()(填充 body 并设置长度/类型)、SetRedirect()(设置 Location 等)、Close()(是否短连接)等。
4.HttpContext
“连接级别”的 HTTP 解析上下文/状态机:把一条 TCP 连接上的字节流按 RECV_STATE_LINE/HEAD/BODY/OVER 分阶段解析成一个完整 HttpRequest;同时维护解析失败时的响应状态码(如 400/414),并支持 ReSet() 以便复用在 keep-alive 的下一次请求解析。
5.HttpServer
基于底层 TcpServer 的 HTTP 应用层封装:通过 OnConnected() 给每个连接绑定 HttpContext。通过 OnMessage() 驱动 HttpContext 解析缓冲区数据:解析未完成就继续等,解析完成就进行路由与响应构造,并用 WriteResponse() 按 HTTP 格式拼响应后发送。提供路由注册接口 Get/Post/Put/Delete:内部用“正则 + handler”的表做匹配分发。支持静态资源:SetBaseDir() 后,GET/HEAD 且路径合法时走 FileHandler() 读取文件并设置 MIME。连接管理策略:根据请求/响应的 Connection 头决定是否 ShutDown();并启用底层的非活跃连接超时释放。

Util模块

 本模块主要是为HTTP解析与静态资源服务提供工具函数,包括字符串处理、URL编码与解码、文件读写、状态码映射、路径合法性校验等。

class Util {
public:
    static int HexToI(int c) {
        if (c >= '0' && c <= '9') {
            return c - '0';
        } else if (c >= 'a' && c <= 'f') {
            return c - 'a' + 10;
        } else if (c >= 'A' && c <= 'F') {
            return c - 'A' + 10;
        } else {
            return -1;
        }
    }
    // 字符串分割
    // 将str按照sep进行分割,结果存入out中,返回分割出的字符串个数
    static size_t SplitString(const std::string str, const std::string sep, std::vector *out) {
        size_t offset = 0;
        while (offset < str.size()) {
            size_t pos = str.find(sep, offset);
            if (pos == std::string::npos) {
                // 说明找到了字符串的末尾
                out->push_back(str.substr(offset, str.size() - offset));
                return out->size();
            }
            if (pos != offset)  // 如果内容为空就不加入到结果中
                out->push_back(str.substr(offset, pos - offset));
            offset = pos + sep.size();  // 移动偏移量
        }
        return out->size();
    }
    // 读取文件内容 将文件的内容放入一个Buffer对象中
    static bool ReadFile(const std::string &filename, std::string *buf) {
        std::ifstream ifs(filename, std::ios::binary);
        if (!ifs.is_open()) {
            LOG_INFO("ReadFile %s failed", filename.c_str());
            return false;
        }
        // 获取文件的大小然后一次性读取
        ifs.seekg(0, ifs.end);            // 将读写位置跳转到文件末尾
        size_t file_size = ifs.tellg();   // 获取当前位置与文件开头的偏移量即为文件大小
        ifs.seekg(0, ifs.beg);            // 将读写位置跳转到文件开头
        buf->resize(file_size);           // 预留空间
        ifs.read(&(*buf)[0], file_size);  // 读取文件内容
        if (ifs.good() == false) {
            LOG_INFO("ReadFile %s failed during read", filename.c_str());
            ifs.close();
            return false;
        }
        ifs.close();
        return true;
    }
    // 向文件中写入内容
    static bool WriteFile(const std::string &filename, const std::string &buf) {
        std::ofstream ofs(filename, std::ios::binary | std::ios::trunc);  // 以二进制写入且清空原有内容
        if (ofs.is_open() == false) {
            LOG_INFO("WriteFile %s failed", filename.c_str());
            return false;
        }
        ofs.write(buf.data(), buf.size());
        if (ofs.good() == false) {
            LOG_INFO("WriteFile %s failed during write", filename.c_str());
            ofs.close();
            return false;
        }
        ofs.close();
        return true;
    }
    // Url编码
    // RFC3986文档 绝对不编码字符 数字 大小写字母 - _ . ~
    // W3C标准规定 空格需要转化为+
    // RFC2396文档规定Url保留字符需要转化为%HH格式
    static std::string UrlEncode(const std::string &url, bool convert_sep_to_plus) {
        std::string result;
        for (auto &c : url) {
            if (c == '-' || c == '_' || c == '.' || c == '~'
                || isalnum(c))  // isalnum可以判断字符是否为数字或字母
            {
                // 不编码字符
                result += c;
                continue;
            } else if (c == ' ' && convert_sep_to_plus) {
                // 空格转化为+
                result += '+';
            } else {
                // 其他字符转化为%HH格式
                char buf[4] = {0};
                snprintf(buf, 4, "%%%02X", c);
                result += buf;
            }
        }
        return result;
    }
    // Url解码
    static std::string UrlDecode(const std::string &url, bool convert_plus_to_space) {
        std::string result;
        for (int i = 0; i < url.size(); i++) {
            if (url[i] == '%' && i + 2 < url.size()) {
                int high = HexToI(url[i + 1]);
                int low = HexToI(url[i + 2]);
                if (high != -1 && low != -1) {
                    char decoded_char = (high << 4) | low;
                    result += decoded_char;
                    i += 2;  // 跳过已经处理的两个字符
                }
            } else if (url[i] == '+' && convert_plus_to_space == true) {
                // + 转化为空格
                result += ' ';
            } else {
                result += url[i];
            }
        }
        return result;
    }
    // 获取文件状态
    static std::string StatusDesc(int code) {
        std::unordered_map status_map = {
            {100, "Continue"},
            {101, "Switching Protocols"},
            {200, "OK"},
            {201, "Created"},
            {202, "Accepted"},
            {203, "Non-Authoritative Information"},
            {204, "No Content"},
            {205, "Reset Content"},
            {206, "Partial Content"},
            {300, "Multiple Choices"},
            {301, "Moved Permanently"},
            {302, "Found"},
            {303, "See Other"},
            {304, "Not Modified"},
            {305, "Use Proxy"},
            {307, "Temporary Redirect"},
            {400, "Bad Request"},
            {401, "Unauthorized"},
            {402, "Payment Required"},
            {403, "Forbidden"},
            {404, "Not Found"},
            {405, "Method Not Allowed"},
            {406, "Not Acceptable"},
            {407, "Proxy Authentication Required"},
            {408, "Request Time-out"},
            {409, "Conflict"},
            {410, "Gone"},
            {411, "Length Required"},
            {412, "Precondition Failed"},
            {413, "Request Entity Too Large"},
            {414, "Request-URI Too Large"},
            {415, "Unsupported Media Type"},
            {416, "Requested range not satisfiable"},
            {417, "Expectation Failed"},
            {500, "Internal Server Error"},
            {501, "Not Implemented"},
            {502, "Bad Gateway"},
            {503, "Service Unavailable"},
            {504, "Gateway Time-out"},
            {505, "HTTP Version not supported"}};
        auto it = status_map.find(code);
        if (it == status_map.end()) {
            return "Unknown Status";
        }
        return it->second;
    }
    // 获取文件Mime
    static std::string ExternMime(const std::string &filename) {
        size_t pos = filename.find_last_of('.');
        if (pos == std::string::npos)
            return "application/octet-stream";  // 默认二进制流
        std::string ext = filename.substr(pos + 1);
        static std::unordered_map mime_map = {
            // 文本与文档类型
            {"txt", "text/plain"},
            {"html", "text/html"},
            {"htm", "text/html"},
            {"css", "text/css"},
            {"csv", "text/csv"},
            {"xml", "text/xml"},

            // 图像类型
            {"jpg", "image/jpeg"},
            {"jpeg", "image/jpeg"},
            {"png", "image/png"},
            {"gif", "image/gif"},
            {"bmp", "image/bmp"},
            {"webp", "image/webp"},
            {"svg", "image/svg+xml"},
            {"ico", "image/x-icon"},

            // 应用程序与二进制文件
            {"pdf", "application/pdf"},
            {"json", "application/json"},
            {"zip", "application/zip"},
            {"rar", "application/vnd.rar"},
            {"7z", "application/x-7z-compressed"},
            {"tar", "application/x-tar"},
            {"gz", "application/gzip"},
            {"exe", "application/x-msdownload"},
            {"doc", "application/msword"},
            {"docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
            {"xls", "application/vnd.ms-excel"},
            {"xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
            {"ppt", "application/vnd.ms-powerpoint"},
            {"pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
            {"odt", "application/vnd.oasis.opendocument.text"},

            // 音频与视频类型
            {"mp3", "audio/mpeg"},
            {"wav", "audio/wav"},
            {"ogg", "audio/ogg"},
            {"aac", "audio/aac"},
            {"mp4", "video/mp4"},
            {"avi", "video/x-msvideo"},
            {"mpeg", "video/mpeg"},
            {"mpg", "video/mpeg"},
            {"webm", "video/webm"},
            {"ogv", "video/ogg"},

            // 字体类型
            {"ttf", "font/ttf"},
            {"otf", "font/otf"},
            {"woff", "font/woff"},
            {"woff2", "font/woff2"},

            // JavaScript
            {"js", "application/javascript"},
            {"mjs", "application/javascript"}  // 可以根据需要添加更多的扩展名和对应的MIME类型
        };
        auto it = mime_map.find(ext);
        if (it == mime_map.end())
            return "application/octet-stream";  // 默认二进制流
        return it->second;
    }
    // 判断该文件是否是目录
    static bool IsDir(const std::string &filename) {
        struct stat path_stat;
        if (stat(filename.c_str(), &path_stat) != 0) {
            return false;  // 无法获取文件状态,可能文件不存在
        }
        return S_ISDIR(path_stat.st_mode);
    }
    // 判断该文件是否是普通文件
    static bool IsRegular(const std::string &filename) {
        struct stat path_stat;
        if (stat(filename.c_str(), &path_stat) != 0) {
            return false;  // 无法获取文件状态,可能文件不存在
        }
        return S_ISREG(path_stat.st_mode);
    }
    // 判断文件路径是否有效
    // 用户只能在相对于某个根目录的范围内访问文件,防止目录遍历攻击
    static bool ValidPath(const std::string &path) {
        // 按照/来分割路径
        std::vector subdirs;
        int ret = SplitString(path, "/", &subdirs);
        int level = 0;
        for (auto &dir : subdirs) {
            if (dir == "..") {
                level--;
                if (level < 0)
                    return false;  // 试图访问根目录之外
            } else if (dir == "." || dir.empty()) {
                // 当前目录或空字符串,忽略
                continue;
            } else
                level++;
        }
        return true;
    }
};

HttpRequest模块

该模块的职责是解析Http请求并将其对应的字段解析并存储起来,提供的方法包括头部字段的查询、插入和获取,Query参数的查询、插入和获取,正文长度获取,是否是长连接等。

class HttpRequest {
public:
    std::string _method;
    std::string _url;
    std::string _version;
    std::string _body;
    std::smatch _matches;
    std::unordered_map _headers;
    std::unordered_map _params;

public:
    HttpRequest()
            : _version("HTTP/1.1") {}
    // 重置
    void Reset() {
        _method.clear();
        _url.clear();
        _version = "HTTP/1.1";
        _body.clear();
        std::smatch tmp;
        _matches.swap(tmp);
        _headers.clear();
        _params.clear();
    }
    // 插入头部字段
    void SetHeader(const std::string &key, const std::string &value) { _headers[key] = value; }
    // 检查头部字段
    bool HasHeader(const std::string &key) const {
        auto it = _headers.find(key);
        if (it == _headers.end())
            return false;
        return true;
    }
    // 获取头部字段的值
    std::string GetHeader(const std::string &key) const {
        auto it = _headers.find(key);
        if (it != _headers.end())
            return it->second;
        return "";
    }
    // 插入查询字符串
    void SetParam(const std::string &key, const std::string &value) { _params[key] = value; }
    // 检查查询字符串
    bool HasParam(const std::string &key) const {
        auto it = _params.find(key);
        if (it == _params.end())
            return false;
        return true;
    }
    // 获取查询字符串的值
    std::string GetParam(const std::string &key) const {
        auto it = _params.find(key);
        if (it != _params.end())
            return it->second;
        return "";
    }
    // 获取正文长度
    size_t ContentLength() const {
        if (HasHeader("Content-Length") == false) {
            return 0;
        }
        return std::stoul(GetHeader("Content-Length"));
    }
    // 判断是否是长连接
    bool Close() {
        if (HasHeader("Connection") && GetHeader("Connection") == "keep-alive")
            return false;  // 长连接
        return true;
    }
};

HttpResponse模块

该模块负责存储HTTP响应的要素(响应状态码、受否重定向、重定向url、正文),提供简单的功能接口,包括头部字段的设置、检查和获取,正文设置,重定向url设置和长短连接判断。

class HttpResponse {
public:
    int _status_code;           // 相应状态码
    bool _redirect_flag;        // 是否重定向
    std::string _redirect_url;  // 重定向地址
    std::string _body;          // 相应正文
    std::unordered_map _headers;

public:
    HttpResponse()
            : _status_code(200)
            , _redirect_flag(false) {}
    HttpResponse(int code)
            : _status_code(code)
            , _redirect_flag(false) {}
    void ReSet() {
        _status_code = 200;
        _redirect_flag = false;
        _redirect_url.clear();
        _body.clear();
        _headers.clear();
    }
    void SetHeader(const std::string &key, const std::string &value) { _headers[key] = value; }
    bool HasHeader(const std::string &key) {
        auto it = _headers.find(key);
        if (it == _headers.end())
            return false;
        return true;
    }
    std::string GetHeader(const std::string &key) {
        auto it = _headers.find(key);
        if (it != _headers.end())
            return it->second;
        return "";
    }
    void SetContent(const std::string &body, const std::string &content_type) {
        _body = body;
        SetHeader("Content-Length", std::to_string(_body.size()));
        SetHeader("Content-Type", content_type);
    }
    void SetRedirect(const std::string &url, int status_code = 302) {
        _redirect_flag = true;
        _redirect_url = url;
        _status_code = status_code;
        SetHeader("Location", url);
    }
    bool Close() {
        if (HasHeader("Connection") && GetHeader("Connection") == "keep-alive")
            return false;  // 长连接
        return true;
    }
};

HttpContext模块

本模块是处理对端发送给服务端的数据,采取状态机的策略来把处理分为四个截断,分别是处理请求行、处理请求头、处理请求正文和处理完毕。只有完成上一个阶段才可以进入下一个阶段,否则在下个阶段会被检测处上个截断并未处理完成从而返回处理错误。并且该模块实现了粘包/半包友好,如果数据不够可以等待数组足够再重新进行处理。

typedef enum {
    RECV_STATE_ERROR,
    RECV_STATE_LINE,
    RECV_STATE_HEAD,
    RECV_STATE_BODY,
    RECV_STATE_OVER
} HttpRecvState;
#define MAX_LINE 8192
class HttpContext {
private:
    int _resp_state;            // 响应状态码
    HttpRecvState _recv_state;  // 接收状态码
    HttpRequest _request;

private:
    bool RecvHttpLine(Buffer *buf)  // 从Buffer中读取数据
    {
        std::string line = buf->GetLine();
        if (line.size() == 0)  // 说明没有读取到数据
        {
            // 存在数据但是没有换行符
            if (buf->ReadAbleSize() > MAX_LINE) {
                // 请求行过于长,不符合要求
                _resp_state = 414;
                _recv_state = RECV_STATE_ERROR;
                return false;
            }
        }
        buf->MoveReadOffset(line.size());
        if (line.size() > MAX_LINE) {
            // 说明请求行过长
            _resp_state = 414;
            _recv_state = RECV_STATE_ERROR;
            return false;
        }
        return ParseHttpLine(line);
    }
    bool ParseHttpLine(std::string &line) {
        std::smatch matches;
        // std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:?(.*))? (HTTP/1..[01])(?:
|
)?");  //
        // 忽略大小写
        std::regex e(
            R"(^(GET|HEAD|POST|PUT|DELETE)s+([^s?]+)(?:?([^s#]*))?s+(HTTP/1.[01])
?
?$)",
            std::regex::icase);
        bool ret = regex_match(line, matches, e);
        if (ret == false) {
            _resp_state = 400;
            _recv_state = RECV_STATE_ERROR;
            return false;
        }
        // 0 原url
        // 1 GET 方法
        // 2 url
        // 3 key=val&key=val……
        // 4 HTTP版本
        _request._method = matches[1];
        std::transform(_request._method.begin(), _request._method.end(), _request._method.begin(), ::toupper);
        _request._url = Util::UrlDecode(matches[2], false);
        _request._version = matches[4];
        std::vector query_string_array;
        std::string query_string = matches[3];
        // 将键值对分组方便分离key val
        Util::SplitString(query_string, "&", &query_string_array);
        for (auto &str : query_string_array) {
            size_t pos = str.find("=");
            if (pos == std::string::npos) {
                _resp_state = 400;
                _recv_state = RECV_STATE_ERROR;
                return false;
            }
            std::string key = Util::UrlDecode(str.substr(0, pos), true);
            std::string val = Util::UrlDecode(str.substr(pos + 1), true);
            _request.SetParam(key, val);
        }
        _recv_state = RECV_STATE_HEAD;
        return true;
    }
    bool RecvHttpHead(Buffer *buf) {
        // 一行一行取出数据即可
        if (_recv_state != RECV_STATE_HEAD)
            return false;
        while (true) {
            std::string line = buf->GetLine();
            if (line.size() == 0)  // 说明没有读取到数据
            {
                // 存在数据但是没有换行符
                if (buf->ReadAbleSize() > MAX_LINE) {
                    // 请求行过于长,不符合要求
                    _resp_state = 414;
                    _recv_state = RECV_STATE_ERROR;
                    return false;
                }
            }
            buf->MoveReadOffset(line.size());
            if (line.size() > MAX_LINE) {
                // 说明请求行过长
                _resp_state = 414;
                _recv_state = RECV_STATE_ERROR;
                return false;
            }
            if (line == "
" || line == "
") {
                _recv_state = RECV_STATE_BODY;
                return true;  // 说明头部读取完毕
            }
            int ret = ParseHttpHead(line);
            if (ret == false)
                return false;
        }
        return true;
    }
    // 解析请求头
    bool ParseHttpHead(std::string &line) {
        if (line.back() == '
')
            line.pop_back();
        if (line.back() == '
')
            line.pop_back();
        size_t pos = line.find(": ");
        if (pos == std::string::npos) {
            _resp_state = 400;
            _recv_state = RECV_STATE_ERROR;
            return false;
        }
        std::string key = line.substr(0, pos);
        std::string val = line.substr(pos + 2);
        _request.SetHeader(key, val);
        //_recv_state = RECV_STATE_BODY;
        return true;
    }
    bool RecvHttpBody(Buffer *buf) {
        if (_recv_state != RECV_STATE_BODY)
            return false;
        // 1.判断该请求是否有正文
        if (_request.ContentLength() == 0) {
            _recv_state = RECV_STATE_OVER;
            return true;
        }
        // 2.存在正文 需要判断Buffer中是否存在足够的数据读取
        // 用ContentLength对应的长度减去目前正文就是还需要读取的正文长度
        size_t rest_len = _request.ContentLength() - _request._body.size();
        if (buf->ReadAbleSize() >= rest_len) {
            // Buffer中的数据大小大于需要读取的正文长度,说明可以读完
            _request._body.append(buf->ReadPosition(), rest_len);
            buf->MoveReadOffset(rest_len);
            _recv_state = RECV_STATE_OVER;
            return true;
        }
        // 说明正文还没有完整读取,需要等待下次数据到达,接收状态保持为RECV_STATE_BODY
        _request._body.append(buf->ReadPosition(), buf->ReadAbleSize());
        buf->MoveReadOffset(buf->ReadAbleSize());
        return true;
    }

public:
    HttpContext()
            : _resp_state(200)
            , _recv_state(RECV_STATE_LINE) {}
    void ReSet() {
        _resp_state = 200;
        _recv_state = RECV_STATE_LINE;
        _request.Reset();
    }
    int RespState() { return _resp_state; }            // 获取请求的响应状态码
    HttpRecvState RecvState() { return _recv_state; }  // 获取当前处理进度
    HttpRequest &Request() { return _request; }        // 获取http请求
    // 接收并解析http请求
    bool RecvHttpRequest(Buffer *buf) {
        // 无需使用break,因为需要顺序向下执行
        switch (_recv_state) {
        case RECV_STATE_LINE:
            RecvHttpLine(buf);
        case RECV_STATE_HEAD:
            RecvHttpHead(buf);
        case RECV_STATE_BODY:
            RecvHttpBody(buf);
        case RECV_STATE_OVER:
            break;
        case RECV_STATE_ERROR:
            return false;
        }
        return true;
    }
};

HttpServer模块

本模块把 TCP 连接上的字节流包装成 HTTP 服务”的顶层组件:负责连接生命周期、HTTP 解析驱动、路由分发、静态资源托管,以及把 HttpResponse 序列化成标准 HTTP/1.1 响应发送出去。

#define DEFAULT_TIMEOUT 10
class HttpServer {
    using PtrConnection = std::shared_ptr;

private:
    TcpServer _server;
    using Handler = const std::function;
    using Handlers = std::vector>;
    Handlers _get_route;
    Handlers _post_route;
    Handlers _put_route;
    Handlers _delete_route;
    std::string _base_dir;

private:
    void ErrorHandler(const HttpRequest &req, HttpResponse *resp) {
        // 1.组织错误页面内容
        std::string body;
        body += "";
        body += "";
        body += "";
        body += "";
        body += "";
        body += "

"; body += std::to_string(resp->_status_code) + " " + Util::StatusDesc(resp->_status_code); body += "

"; body += "
"; body += ""; body += ""; // 2.为响应对象填充内容 resp->SetContent(body, "text/html"); } // 对功能性事件进行派发 void Dispatcher(HttpRequest &req, HttpResponse *resp, Handlers &handlers) { // 在对应的方法路由表中进行查找,如果存在匹配的路由则调用对应的处理函数,反之则返回404 for (auto &handler : handlers) { const std::regex re = handler.first; const Handler &functor = handler.second; bool ret = std::regex_match(req._url, req._matches, re); // 将匹配结果存入req._matches中 if (ret == false) continue; return functor(req, resp); } resp->_status_code = 404; // 未找到 return; } // 路由 void Route(HttpRequest &req, HttpResponse *resp) { // 1.对请求进行分辨,判断是静态资源请求还是功能性请求 if (IsFileHandler(req) == true) { return FileHandler(req, resp); } if (req._method == "GET") { return Dispatcher(req, resp, _get_route); } else if (req._method == "POST") { return Dispatcher(req, resp, _post_route); } else if (req._method == "PUT") { return Dispatcher(req, resp, _put_route); } else if (req._method == "DELETE") { return Dispatcher(req, resp, _delete_route); } resp->_status_code = 405; // 方法不被允许 return; } bool IsFileHandler(const HttpRequest &req) { // 静态资源的路径必须已经设置 if (_base_dir.empty() == true) return false; // 判断请求的方法 if (req._method != "GET" && req._method != "HEAD") return false; // 判断请求的url是否合法 if (Util::ValidPath(req._url) == false) return false; std::string real_path = _base_dir + req._url; if (!real_path.empty() && real_path.back() == '/') real_path += "index.html"; // 判断该路径是否存在且是一个普通文件 if (Util::IsRegular(real_path) == false) return false; return true; } // 对静态资源获取 void FileHandler(HttpRequest &req, HttpResponse *resp) { std::string req_path = _base_dir + req._url; if (req._url.back() == '/') req_path += "index.html"; req._url = req_path; bool ret = Util::ReadFile(req._url, &resp->_body); if (ret == false) { resp->_status_code = 404; // 未找到 return; } std::string mime = Util::ExternMime(req._url); resp->SetHeader("Content-Type", mime); return; } // 生成http Response格式的内容进行发送 void WriteResponse(const PtrConnection &conn, HttpRequest &req, HttpResponse *resp) { // 1.完善头部字段 if (req.Close() == true) { resp->SetHeader("Connection", "close"); } else { resp->SetHeader("Connection", "keep-alive"); } if (resp->HasHeader("Content-Length") == false) { resp->SetHeader("Content-Length", std::to_string(resp->_body.size())); } if (resp->_body.empty() == false && resp->HasHeader("Content-Type") == false) { resp->SetHeader("Content-Type", "application/octet-stream"); } if (resp->_redirect_flag == true && resp->HasHeader("Location") == false) { resp->SetHeader("Location", resp->_redirect_url); } // 2.根据http协议的格式来组织内容 std::stringstream resp_str; resp_str << "HTTP/1.1 " << resp->_status_code << " " << Util::StatusDesc(resp->_status_code) << " "; for (auto &header : resp->_headers) { resp_str << header.first << ": " << header.second << " "; } resp_str << " "; // 头部和正文之间需要有一个空行 resp_str << resp->_body; LOG_INFO("Response:%s", resp_str.str().c_str()); // 3.发送Response conn->Send(resp_str.str().c_str(), resp_str.str().size()); } // 设置上下文 void OnConnected(const PtrConnection &conn) { conn->SetContext(HttpContext()); LOG_INFO("A new Connection:%p", conn.get()); } // 对缓冲区数据进行分析和处理 void OnMessage(const PtrConnection &conn, Buffer *buf) { // 1.获取上下文 HttpContext *context = conn->GetContext()->get(); // 2.通过上下文对缓冲区的数据进行解析 context->RecvHttpRequest(buf); HttpResponse resp(context->RespState()); HttpRequest &req = context->Request(); if (context->RespState() >= 400) { // 说明出错 ErrorHandler(req, &resp); // 为错误页面填充信息 WriteResponse(conn, req, &resp); context->ReSet();//重置上下文,防止下次请求受到影响 buf->MoveReadOffset(buf->ReadAbleSize()); // 清空缓冲区数据 conn->ShutDown(); return; } if (context->RecvState() != RECV_STATE_OVER) { // 说明数据还未接收完毕,还需要继续接收新数据 return; } // 3.请求路由 + 业务分配 Route(req, &resp); // 4.对HttpResponse进行发送 WriteResponse(conn, req, &resp); // 5.重置上下文 context->ReSet(); // 6.判断长短连接 if (resp.Close() == true) conn->ShutDown(); } public: HttpServer(uint16_t port, int timeout = DEFAULT_TIMEOUT) : _server(port) { _server.SetConnectionCallback(std::bind(&HttpServer::OnConnected, this, std::placeholders::_1)); _server.SetMessageCallback( std::bind(&HttpServer::OnMessage, this, std::placeholders::_1, std::placeholders::_2)); _server.EnableInactiveRelease(timeout); } void Get(const std::string &pattern, Handler &Handler) { _get_route.push_back(make_pair(std::regex(pattern), Handler)); } void Post(const std::string &pattern, Handler &Handler) { _post_route.push_back(make_pair(std::regex(pattern), Handler)); } void Put(const std::string &pattern, Handler &Handler) { _put_route.push_back(make_pair(std::regex(pattern), Handler)); } void Delete(const std::string &pattern, Handler &Handler) { _delete_route.push_back(make_pair(std::regex(pattern), Handler)); } void SetBaseDir(const std::string &filepath) { _base_dir = filepath; } void SetThreadCount(int count) { _server.SetThreadCount(count); } void Listen() { _server.Start(); } };

本文地址:https://www.vps345.com/24552.html

搜索文章

Tags

docker 容器 运维 java-rabbitmq java 智能驾驶 BEVFusion Ubuntu 服务器带宽 上行带宽 上行速率 什么是上行带宽? PV计算 带宽计算 流量带宽 #docker #centos #容器 #windows #自动化 #运维 linux pytorch tensorflow macos windows 服务器 网络 远程连接 vscode 嵌入式硬件 #git #ssh #windows ubuntu24.04 todesk 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP CC攻击 攻击怎么办 AI Dify 大模型应用 #linux #命令 #网络 ide ubuntu 无人机 机器人 github #ubuntu #linux ssh漏洞 ssh9.9p2 CVE-2025-23419 python c++ php ai nlp #harmonyos #android #ios #java #华为 harmonyos 华为 react native c# 开发语言 网络协议 网络安全 centos 人工智能 #macos #EasyConnect 云原生 #javascript #开发语言 #ecmascript 安全 #jenkins #人工智能 #云原生 #区块链 #智能合约 ssh remote-ssh 部署 边缘计算 具身智能 强化学习 ollama llm conda ROS 自动驾驶 经验分享 自动化 wireshark prometheus grafana 深度学习 IPMI micropython esp32 单片机 mqtt 物联网 远程工作 debian wps 安卓 web3 区块链 区块链项目 tomcat 中间件 web安全 可信计算技术 安全架构 网络攻击模型 CosyVoice zabbix fpga开发 服务器安全 网络安全策略 防御服务器攻击 安全威胁和解决方案 程序员博客保护 数据保护 安全最佳实践 智能合约 压力测试 哈希算法 LLM 大模型面经 大模型 职场和发展 Deepseek 大模型学习 语言模型 AI大模型 DeepSeek agi 数据库 mysql adb #激光雷达 #览沃 #ubuntu22.04 #ros2 #大疆 uni-app m3u8 HLS 小程序 移动端H5网页 APP安卓苹果ios 监控画面 直播视频流 网络药理学 生信 分子对接 autodock mgltools PDB PubChem 火绒安全 mybase 游戏引擎 学习 Playwright pythonai PlaywrightMCP n8n AIGC comfyui comfyui教程 r语言 数据挖掘 数据可视化 数据分析 机器学习 存储维护 NetApp存储 EMC存储 intellij-idea kylin stm32 tcp/ip 华为云 华为od 快捷键 旋转屏幕 自动操作 1024程序员节 计算机视觉 虚拟机 flutter Google pay Apple pay 开源 dity make 持续部署 jenkins apache pdf xml ddos Agent llama CrewAI Linux 维护模式 MVS 海康威视相机 3d gpu算力 bash 编辑器 pip #人工智能 #深度学习 #机器学习 #考研 #计算机视觉 网络工程师 华为认证 策略模式 mac mac安装软件 mac卸载软件 mac book #网络 #dify ssl 阿里云 云计算 ruoyi YOLOv8 NPU Atlas800 A300I pro ESXi Dell HPE 联想 浪潮 智能路由器 Java进程管理 DevOps自动化 脚本执行 跨平台开发 远程运维 Apache Exec JSch golang YOLO 目标检测 rk3588 npu rknn-toolkit2 群晖 低代码 负载均衡 unix git kvm qemu libvirt unity GameFramework HybridCLR Unity编辑器扩展 自动化工具 性能优化 yolov5 arm开发 神经网络 pycharm 搜索引擎 程序员 prompt ffmpeg 音视频 视频编解码 dash json 正则表达式 DevEco Studio HarmonyOS OpenHarmony 真机调试 appium 软件测试 自动化测试 功能测试 程序人生 svn 电路仿真 multisim 硬件工程师 硬件工程师学习 电路图 电路分析 仪器仪表 MacMini Mac 迷你主机 mini Apple 算法 spring boot spring django fastapi 后端 #算法 #数据清洗 springsecurity6 oauth2 授权服务器 前后端分离 html http css Kylin-Server 国产操作系统 服务器安装 onlyoffice 在线office 鸿蒙 typescript 微信 gnu iot rpa qt linuxdeployqt 打包部署程序 appimagetool EVE-NG 计算机网络 自然语言处理 rag ragflow 大模型部署 deepseek 鲲鹏 昇腾 c语言 oceanbase 传统数据库升级 银行 redis 飞牛NAS 飞牛OS MacBook Pro 混合开发 环境安装 JDK SenseVoice 流程图 mermaid #chrome #mac #拓展程序 #禁用 AI编程 visual studio code 单例模式 嵌入式Linux IPC 前端 nginx MCP #字体 #安装 #微软雅黑 #office milvus Docker Docker Compose Kubernetes chatgpt open webui bug 运维开发 #c++ 其他 #IntelliJ IDEA #Java #Kotlin 课程设计 Autoware 辅助驾驶 opencv Cline CUDA PyTorch GCC aarch64 编译安装 HPC crosstool-ng #embedding 银河麒麟 信创国产化 达梦数据库 linux环境变量 nvcc cuda A100 MobaXterm 文件传输 动态库 GCC编译器 -fPIC -shared word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 uniapp vue vmamba mcu Qwen3 qwen3 32b vllm 本地部署 设计模式 向量数据库 vite Svelte 架构 #centos #vscode #ubuntu lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 程序 编程 内存 性能分析 AI提示词优化 microsoft 硬件工程 #开发语言 #c语言 实时音视频 实时互动 searxng 智能手机 rpc 远程过程调用 Windows环境 信息与通信 #服务器 图像处理 mybatis DevOps 大数据 软件交付 数据驱动 应用场景 数据安全 大模型压力测试 EvalScope ansible playbook 自动化运维 rtsp h.265 chrome chrome devtools selenium chromedriver 小智 爬虫 交换机 硬件 设备 GPU PCI-Express SSH Linux Xterminal MS Materials postgresql pgpool AutoDL Qwen2.5-VL okhttp android mamba dify dify部署 三维重建 游戏 HTTP 服务器控制 ESP32 DeepSeek FunASR ASR android studio 交互 websocket 笔记 个人开发 gpt transformer 鸿蒙系统 hdc 鸿蒙NEXT 截图 录屏 gif 工具 技能大赛 cron crontab日志 springboot容器部署 springboot容器化部署 微服务容器化负载均衡配置 微服务容器多节点部署 微服务多节点部署配置负载均衡 LLM Web APP Streamlit iventoy VmWare OpenEuler 麒麟OS zephyr Claude Desktop Claude MCP Windows Cli MCP #自动化 大模型入门 大模型教程 游戏服务器 Minecraft #游戏 #服务器 #云计算 政务 分布式系统 监控运维 Prometheus Grafana elasticsearch 知识图谱 飞腾处理器 硬件架构 国产化 rust 进程 操作系统 进程控制 oracle 关系型 分布式 UOS 开机自启动 桌面快捷方式 arcgis gitlab jupyter kubernetes k8s openEuler 欧拉系统 工作流自动化工具 bushujiaocheng 部署教程 算家云 AI算力 租算力 到算家云 coze 华为机试 C++ Java Python glibc HTTP状态码 客户端错误 服务器端错误 API设计 openssl 嵌入式 linux驱动开发 javascript eclipse 5G 数据集 Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer wsl docker desktop image 蓝桥杯 vue.js node.js 智能体开发 rc.local 开机自启 systemd 麒麟 服务器配置 Deepseek-R1 私有化部署 推理模型 CH340 串口驱动 CH341 uart 485 WSL2 上安装 Ubuntu 环境部署 rabbitmq vim 计算机学习路线 编程语言选择 MLLMs VLM gpt-4v SSE 代码调试 ipdb 安全漏洞 信息安全 pygame openjdk 远程桌面 llama3 Chatglm 开源大模型 三级等保 服务器审计日志备份 企业微信 chatbox LVS 软件工程 软件构建 cmake 电脑桌面出现linux图标 电脑桌面linux图标删除不了 电脑桌面Liunx图标删不掉 linux图标删不掉 测试工具 网页服务器 web服务器 Nginx IPv4/IPv6双栈 双栈技术 网路规划设计 ensp综合实验 IPv4过渡IPv6 IPv4与IPv6 毕设 Windsurf LLMs GenAI LLM 推理优化 LLM serving seatunnel eureka spring cloud nohup 异步执行 Apache Flume 数据采集 安装部署 配置优化 高级功能 大数据工具集成 王者荣耀 系统架构 EasyConnect opensearch helm ragflow 源码启动 vue3 HCIE 数通 大大通 第三代半导体 碳化硅 科技 Windows ai工具 监控 计算机外设 openwrt USB网络共享 Docker Hub docker pull 镜像源 daemon.json 多线程服务器 Linux网络编程 FTP服务器 驱动开发 嵌入式实习 dubbo 视频平台 录像 RTSP 视频转发 性能测试 视频流 存储 信号处理 tcpdump gitee gitee go 云计算面试题 umeditor粘贴word ueditor粘贴word ueditor复制word ueditor上传word图片 #提示词注入 #防护 #安全 #大模型 UEFI Legacy MBR GPT U盘安装操作系统 chromium dpi cursor 华为鸿蒙系统 ArkTS语言 Component 生命周期 条件渲染 Image图片组件 webpack YOLOv12 网络结构图 yaml Ultralytics 可视化 langchain deep learning 进程信号 知识库 本地化部署 ACL 流量控制 基本ACL 网络管理 规则配置 安全威胁分析 安全性测试 visualstudio 环境迁移 GIS 遥感 WebGIS 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 程序化交易 量化交易 高频交易 mariadb mcp mcp协议 go-zero mcp服务器 harmonyOS面试题 进程间通信 开发工具 基础指令 指令 nac 802.1 portal xrdp 语音识别 servlet muduo 网络库 hadoop big data Spring AI 大模型应用开发 AI 应用商业化 sdkman 安卓模拟器 arkUI arkTs GPU训练 RTX5090 torch2.7.0 ui 金融 相机 主从复制 计算生物学 生物信息学 生物信息 基因组 ShapeFile GeoJSON devops 防火墙 ufw word 学习方法 宝塔面板 Cursor iNode Macos burpsuite 安全工具 mac安全工具 burp安装教程 渗透工具 Ollama RAGFlow 本地知识库部署 DeepSeek R1 模型 Claude 微服务 数据结构 换源 国内源 Debian Alist rclone mount 挂载 网盘 考研 MCP server agent C/S FTP 服务器 DNS jar 统信 UOS1070e Chatbox PyQt PySide6 重启 排查 系统重启 日志 原因 多线程 pthread 系统 SecureCRT Bug解决 Qt platform OpenCV ros 树莓派项目 latex 模块测试 wsl2 QQ bot Vmamba flash-attention 报错 iBMC UltraISO maven 云服务器 open Euler dde deepin 统信UOS 统信操作系统 yum HarmonyOS Next can 线程池 RAID RAID技术 磁盘 镜像 Kali 渗透 物理地址 页表 虚拟地址 缓存 微信公众平台 RagFlow RAG 雨云 NPS 虚拟机安装 triton 模型分析 服务器扩容没有扩容成功 matlab element-ui 上传视频并预览视频 vue上传本地视频及进度条功能 vue2选择视频上传到服务器 upload上传视频组件插件 批量上传视频 限制单个上传视频 vmware tools VMware 计算机系统 网络编程 archlinux kde plasma 产品经理 lvgl8.3 lvgl9.2 lvgl lvgl安装 工作流 workflow 程序员创富 perl 百度 paddlepaddle 集成学习 集成测试 stm32项目 系统安全 kind arm flask web3.py ESP32 Java Applet URL操作 服务器建立 Socket编程 网络文件读取 grub 版本升级 扩容 微信开放平台 微信公众号配置 话题通信 服务通信 windows 服务器安装 Pyppeteer jvm 源代码管理 电子信息 通信工程 毕业 软件商店 信创 livecd systemtools 安装MySQL postgres Docker Desktop Dify重启后重新初始化 deepseek-v3 ktransformers Multi-Agent #redis 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 智能硬件 外网访问 内网穿透 端口映射 gemini gemini国内访问 gemini api gemini中转搭建 Cloudflare NFS nftables nvm node react.js list 宝塔 文心一言 gcc centos 7 cudnn nvidia docker compose 烟雾检测 yolo检测 消防检测 开源软件 tidb GLIBC elk glm4 电脑 NVML nvidia-smi 客户端-服务器架构 点对点网络 服务协议 网络虚拟化 网络安全防御 抽象工厂模式 apt 前端框架 vmware ArkTS RockyLinux libreoffice word转pdf 安装 代码复审 codereview code-review #git #vim Logstash 日志采集 Trae IDE AI 原生集成开发环境 Trae AI NAS Termux Samba midjourney AI写作 密码学 微信小程序 notepad++ ip kernel function address 函数 地址 内核 迁移 openeuler FS 文件系统 bootfs rootfs linux目录 eNSP 企业网络规划 华为eNSP 网络规划 环境配置 线程 ecmascript KVM 远程 命令 执行 sshpass 操作 ai小智 语音助手 ai小智配网 ai小智教程 esp32语音助手 diy语音助手 卷积神经网络 k8s部署 MySQL8.0 高可用集群(1主2从) 论文笔记 代理模式 升级 CVE-2024-7347 漏洞 H3C RustDesk自建服务器 rustdesk服务器 docker rustdesk 自定义客户端 SAS IMM https 反向代理 生成对抗网络 Uvicorn 数学建模 centos-root /dev/mapper yum clean all df -h / du -sh 软件需求 embedding stable diffusion AI作画 网络建设与运维 网络搭建 神州数码 神州数码云平台 云平台 udp 物联网开发 MQTT 大模型微调 我的世界 我的世界联机 数码 无桌面 命令行 sql 游戏程序 Dell R750XS 弹性计算 裸金属服务器 弹性裸金属服务器 虚拟化 KylinV10 麒麟操作系统 Vmware bigdata trae sequoiaDB 隐藏文件 Mermaid 可视化图表 自动化生成 android-studio nohup后台启动 健康医疗 常用命令 文本命令 目录命令 ISO镜像作为本地源 wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 Python 视频爬取教程 Python 视频爬取 Python教程 Python 视频教程 rsync 矩阵乘法 3D深度学习 虚拟显示器 远程控制 我的世界服务器搭建 minecraft 安装教程 GPU环境配置 Ubuntu22 Anaconda安装 桌面环境 zookeeper 实时内核 jdk Obsidian Dataview vsxsrv easyTier 组网 yolov8 rnn 抓包工具 前端面试题 fiddler Crawlee 线程互斥与同步 音乐服务器 Navidrome 音流 ukui 麒麟kylinos C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 webrtc hive ranger MySQL8.0 ftp服务 文件上传 树莓派 华为昇腾910b3 性能监控 anaconda ArkTs ArkUI maxkb ARG 开发环境 VSCode 微软 文档 DBeaver 数据仓库 kerberos miniapp 调试 debug 断点 网络API请求调试方法 终端工具 远程工具 dns是什么 如何设置电脑dns dns应该如何设置 记账软件 springboot 容器部署 计算机八股 网络配置 路由配置 框架搭建 v10 软件 致远OA OA服务器 服务器磁盘扩容 jmeter postman aws 分布式账本 信任链 共识算法 云电脑 5090 显卡 AI性能 开发效率 Windmill protobuf 序列化和反序列化 jellyfin nas rocketmq 人工智能生成内容 miniconda paddle Kali Linux virtualenv 增强现实 沉浸式体验 技术实现 案例分析 AR 监控k8s集群 集群内prometheus 性能调优 安全代理 etcd cfssl PX4 Linux Vim 网络爬虫 lstm LSTM-SVM 时间序列预测 仙盟大衍灵机 东方仙盟 仙盟创梦IDE issue C语言 豆瓣 追剧助手 迅雷 adobe mosquitto 消息队列 asp.net大文件上传 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 .net mvc断点续传 IM即时通讯 剪切板对通 HTML FORMAT HP Anyware AI-native 7-zip ipython C 环境变量 进程地址空间 neo4j 数据库开发 database xcode python2 gpt-3 ollama api ollama外网访问 IP地址 IPv4 IPv6 端口号 计算机基础 更换镜像源 shell minio ShenTong minicom 串口调试工具 docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos gromacs 分子动力学模拟 MD 动力学模拟 ROS2 Masshunter 质谱采集分析软件 使用教程 科研软件 创业创新 GPUGEEK STP 生成树协议 PVST RSTP MSTP 防环路 网络基础 unionFS OverlayFS OCI docker架构 写时复制 Apache OpenNLP 句子检测 分词 词性标注 核心指代解析 僵尸世界大战 游戏服务器搭建 string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap thingsboard 计算虚拟化 弹性裸金属 游戏开发 html5 less .netcore .net core .net 虚幻 Netty OpenGL 图形渲染 状态模式 cocoapods ubuntu20.04 开机黑屏 notepad CPU 使用率 系统监控工具 linux 命令 burp suite 抓包 打不开xxx软件 无法检查其是否包含恶意软件 css3 js 渗透测试 系统内核 Linux版本 TRAE 腾讯云大模型知识引擎 DocFlow 拓扑图 监控k8s 监控kubernetes go LSTM mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 单一职责原则 rust腐蚀 测试用例 p2p ios massa sui aptos sei python3.11 pyside6 界面 localhost LangGraph CLI JavaScript langgraph.json ECS API 毕业设计 struts 物联网嵌入式开发实训室 物联网实训室 嵌入式开发实训室 物联网应用技术专业实训室 源码 MacOS 向日葵 g++ g++13 Ubuntu 22.04 MySql 算力租赁 Android ANDROID_HOME zshrc charles vnc HP打印机 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 PPI String Cytoscape CytoHubba ip命令 新增网卡 新增IP 启动网卡 rdp 远程服务 脚本 软考设计师 中级设计师 SQL 软件设计师 gru Docker 部署es9 Docker部署es Docker搭建es9 Elasticsearch9 Docker搭建es #运维 #openssh升级 #银河麒麟V10 SP10 pppoe radius 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 odoo 服务器动作 Server action 媒体 大模型推理 frp 内网服务器 内网代理 内网通信 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP express 聊天室 kafka AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 Jellyfin 锁屏不生效 c/c++ 串口 perf linux内核 iTerm2 sqlserver 磁盘挂载 新盘添加 partedUtil tftp nfs NVIDIA显卡安装 Ubuntu开机黑屏 鸿蒙项目 #数据库 AI代码编辑器 车载系统 3GPP 卫星通信 mcp-proxy mcp-inspector fastapi-mcp sse yum源切换 更换国内yum源 自动化任务管理 虚拟局域网 Node-Red 编程工具 流编程 yum换源 计算机科学与技术 开放端口 访问列表 kubeless 超级终端 多任务操作 提高工作效率 面试 写时拷贝 Linux的进程调度队列 活动队列 数字化转型 团队开发 spark HistoryServer Spark YARN jobhistory armbian u-boot 云电竞 unity3d CORS 跨域 服务器繁忙 nuxt3 文件分享 WebDAV tailscale derp derper 中转 bonding 链路聚合 SWAT 配置文件 服务管理 网络共享 网站搭建 serv00 博客 图形化界面 saltstack 笔灵AI AI工具 CPU架构 服务器cpu 若依 内存不足 outofmemory Key exchange 主包过大 Featurize Mobilenet 分割 cn2 带宽 HarmonyOS5 prometheus数据采集 prometheus数据模型 prometheus特点 openvpn server openvpn配置教程 centos安装openvpn Isaac Sim 虚拟仿真 WSL resolv.conf Charles chrome历史版本下载 chrominum下载 软硬链接 文件 蓝耘科技 元生代平台工作流 ComfyUI openstack Xen Hyper-V seleium ip协议 网卡 autoware ros2 卸载 列表 转换 ajax Quixel Fab Unity UE5 游戏商城 虚幻引擎 实验 技术 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 网工 Anolis nginx安装 linux插件下载 剧本 CDN LDAP AD 域管理 服务器管理 配置教程 网站管理 NFC 近场通讯 智能门锁 显示器 finebi Arduino 电子信息工程 make命令 makefile文件 ArcTS 登录 ArcUI GridItem 命名管道 客户端与服务端通信 fstab initramfs Linux内核 Grub mac设置host 苹果电脑装windows系统 mac安装windows系统 mac装双系统 macbook安装win10双 mac安装win10双系统 苹果电脑上安装双系统 mac air安装win RAGflow Python基础 Python技巧 WSL2 easyui deekseek 显卡驱动持久化 GPU持久化 #llama #docker #kimi xop RTP RTSPServer 推流 视频 autodl dell服务器 gaussdb 云服务 分布式训练 机柜 1U 2U 录音麦克风权限判断检测 录音功能 录音文件mp3播放 小程序实现录音及播放功能 RecorderManager 解决录音报错播放没声音问题 AI员工 aac fpga janus gitlab服务器 chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 稳定性 看门狗 pyicu Echarts图表 折线图 柱状图 异步动态数据 鸿蒙开发 可视化效果 Ubuntu20.04 2.35 pycharm安装 SystemV #pytorch 深度求索 私域 SSH 服务 SSH Server OpenSSH Server Open WebUI RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 moveit 机器人运动 云原生开发 接口优化 k8s二次开发 zip unzip kali 共享文件夹 mongodb edge 宝塔面板无法访问 MAVROS 四旋翼无人机 Agentic Web NLWeb 自然语言网络 微软build大会 二级页表 数据链路层 shell编程 即时通信 NIO 黑客 计算机 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 XCC Lenovo dba 客户端 java-ee 进程优先级 调度队列 进程切换 智慧农业 开源鸿蒙 动静态库 harmonyosnext homebrew windows转mac ssh密匙 Mac配brew环境变量 Linux24.04 网络用户购物行为分析可视化平台 大数据毕业设计 OpenManus intellij idea opengl 隐藏目录 管理器 通配符 冯诺依曼体系 企业风控系统 互联网反欺诈 DDoS攻击 SQL注入攻击 恶意软件和病毒攻击 切换root 大语言模型 lvs CAN 多总线 Typescript 局域网 lua #java #maven #java-ee #spring boot #jvm #kafka #tomcat react next.js 部署next.js rustdesk SSL证书 cpu 实时 使用 excel 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 数据库系统 PVE iis vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 腾讯云 llama.cpp 信创终端 中科方德 大模型训练/推理 推理问题 mindie 网络接口 时间间隔 所有接口 多网口 teamspeak 客户端/服务器架构 分布式应用 三层架构 Web应用 跨平台兼容性 滑动验证码 反爬虫 #金融 #科技 #大数据 京东云 移动开发 bcompare Beyond Compare 系统开发 binder framework 源码环境 HiCar CarLife+ CarPlay QT RK3588 docker-compose 网络文件系统 Ardupilot IP 地址 Metastore Catalog vm OpenSSH docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 7z 私有化 Helm k8s集群 ubuntu安装 linux入门小白 文件共享 audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 信息收集 银河麒麟高级服务器 外接硬盘 Kylin 状态管理的 UDP 服务器 Arduino RTOS VNC React Next.js 开源框架 硅基流动 ChatBox 概率论 linq sqlite 串口服务器 万物互联 工业自动化 工厂改造 材料工程 全文检索 服务发现 uni-popup报错 连接服务器超时 点击屏幕重试 uniapp编译报错 uniapp vue3 imported module TypeError 邮件APP 免费软件 灵办AI 版本 华为证书 HarmonyOS认证 华为证书考试 rime 星河版 brew milvus安装 代码 对比 meld DiffMerge orbslam2 ubuntu22.04 vr 数码相机 全景相机 设备选择 实用技巧 数字空间 药品管理 空Ability示例项目 讲解 视觉检测 办公自动化 pdf教程 Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 单元测试 路径解析 docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 x64 SIGSEGV xmm0 RBAC Xinference numpy 显示过滤器 ICMP Wireshark安装 System V共享内存 进程通信 top Linux top top命令详解 top命令重点 top常用参数 ros1 Noetic 20.04 apt 安装 Apache Beam 批流统一 案例展示 数据分区 容错机制 软考 2024 2024年上半年 下午真题 答案 cnn VGG网络 卷积层 池化层 Xshell client-go 百度云 Linux权限 xshell 权限掩码 粘滞位 CKA 模拟器 pnet pnetlab powerpoint 磁盘满 tcp pyqt firefox outlook Carla 浪潮信息 AI服务器 gunicorn PTrade QMT 量化股票 实时传输 过期连接 漫展 flink flinkcdc AudioLM scrapy 多端开发 智慧分发 应用生态 鸿蒙OS Qwen2.5-coder 离线部署 NVM Node Yarn PM2 swift gstreamer 流媒体 更新apt 安装hadoop前的准备工作 VLAN 企业网络 iperf3 带宽测试 ue4 着色器 ue5 设置代理 实用教程 DeepSeek r1 qt5 客户端开发 大屏端 LVM 磁盘分区 lvresize 磁盘扩容 pvcreate 双系统 多系统 嵌入式实时数据库 pandas matplotlib pillow Ubuntu 24.04.1 轻量级服务器 模型联网 CherryStudio 直播推流 X11 Xming 毕昇JDK 日志分析 系统取证 商用密码产品体系 logstash http状态码 请求协议 SRS 显卡驱动 nvidia驱动 Tesla显卡 DICOM mcp client mcp server 模型上下文协议 iftop 网络流量监控 GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 ArtTS kotlin iphone 推荐算法 线程同步 线程互斥 条件变量 管道 pipe函数 匿名管道 管道的大小 匿名管道的四种情况 linux/cmake 鸿蒙面试 面试题 北亚数据恢复 数据恢复 服务器数据恢复 数据库数据恢复 oracle数据恢复 上架 ubuntu24.04.1 Reactor RDP 进程池实现 OS ocr 可用性测试 深度强化学习 深度Q网络 Q_Learning 经验回收 去中心化 驱动器映射 批量映射 win32wnet模块 网络驱动器映射工具 弹性 汇编 csapp 缓冲区 AD域 kylin v10 麒麟 v10 Headless Linux ldap 项目部署到linux服务器 项目部署过程 网络穿透 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 vu大文件秒传跨域报错cors Web服务器 多线程下载工具 PYTHON es6 qt6.3 g726 solidworks安装 Cache Aside Read/Write Write Behind ueditor导入word SFTP SFTP服务端 沙盒 mysql安装报错 windows拒绝安装 CUPS 打印机 Qt5 NVIDIA 可执行程序 firewalld OpenCore illustrator vr看房 在线看房系统 房产营销 房产经济 三维空间 podman 美食 #apache 热榜 互联网医院 卡死 camera Typore 蓝牙 GeneCards OMIM TTD tar 图搜索算法 考试 裸机装机 linux磁盘分区 裸机安装linux 裸机安装ubuntu 裸机安装kali 裸机 python高级编程 Ansible elk stack 智能体 高考 省份 年份 分数线 数据 authorized_keys 密钥 MySQL sse_starlette Starlette FastAPI Server-Sent Eve 服务器推送事件 IIS Hosting Bundle .NET Framework vs2022 rsyslog edge浏览器 windows日志 api token sas 模拟退火算法 思科模拟器 思科 Cisco dns 上传视频文件到服务器 uniApp本地上传视频并预览 uniapp移动端h5网页 uniapp微信小程序上传视频 uniapp app端视频上传 uniapp uview组件库 samba 机架式服务器 1U工控机 国产工控机 linux cpu负载异常 cs144 SQI iOS Server Trust Authentication Challenge jvm调优 内存泄漏 LRU策略 内存增长 垃圾回收 黑苹果 Linux的基础指令 VMware安装mocOS macOS系统安装 嵌入式系统开发 权限 npm dnf #华为 #harmonyos #手机 运维监控 WireGuard 异地组网 Reactor反应堆 risc-v nacos Jenkins流水线 声明式流水线 SoC 原子操作 AXI Nginx报错413 Request Entity Too Large 的客户端请求体限制 机器人操作系统 进程状态 僵尸进程 容器化 oneapi gitea TrinityCore 魔兽世界 磁盘监控 mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 YashanDB 崖山数据库 yashandb OSB Oracle中间件 SOA 接口隔离原则 零售 前端项目部署 微前端 deepseek r1 Hive环境搭建 hive3环境 Hive远程模式 ci/cd 本地部署AI大模型 Mac内存不够用怎么办 beautifulsoup STL sublime text termux IMX317 MIPI H265 VCU Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 P2P HDLC Zoertier 内网组网 autogen openai visual studio d3d12 axure 轮播图 Spring Boot es lsof linux命令 #apache #flink #python3.11 直播 zotero 同步失败 echarts 信息可视化 网页设计 IIS服务器 IIS性能 日志监控 db 云桌面 AD域控 证书服务器 服务器ssl异常解决 科勘海洋 数据采集浮标 浮标数据采集模块 MultiServerMCPC load_mcp_tools load_mcp_prompt 深度优先 blender three.js 数字孪生 大学大模型可视化教学 全球气象可视化 大学气象可视化 TCP 多进程 TCP回显服务器 华为OD机考 机考真题 需要广播的服务器数量 JavaWeb 回显服务器 Echo VMware安装Ubuntu Ubuntu安装k8s 教程 中兴光猫 换光猫 网络桥接 自己换光猫 fd 文件描述符 AList webdav fnOS Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 设备树 环境搭建 免密 公钥 私钥 photoshop debezium 数据变更 数据迁移 进程等待 进程程序替换 execl函数 execv函数 execvp函数 execvpe函数 putenv函数 调试方法 Valgrind 内存分析工具 uboot 部署方案 IMX6ULL #kali 自动化编程 Doris搭建 docker搭建Doris Doris搭建过程 linux搭建Doris Doris搭建详细步骤 Doris部署 VMware Tools vmware tools安装 vmwaretools安装步骤 vmwaretools安装失败 vmware tool安装步骤 vm tools安装步骤 vm tools安装后不能拖 vmware tools安装步骤 Serverless 内存管理 学习路线 Arduino下载开发板 esp32开发板 esp32-s3 MinerU 量子计算 Makefile Make 客户端和服务器端 dataworks maxcompute 飞书 #YOLO #目标检测 #YOLOv13 #python VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 流式接口 ecm bpm kamailio sip VoIP 远程看看 远程协助 半虚拟化 硬件虚拟化 Hypervisor web 规格说明书 设计规范 vCenter服务器 ESXi主机 监控与管理 故障排除 日志记录 工厂方法模式 证书 签名 排序算法 HTTP3 全双工通信 多路复用 实时数据传输 sonoma 自动更新 用户缓冲区 lio-sam SLAM csrf firewall devmem tar.gz tar.xz linux压缩 CTE AGE libtorch MAC地址 pyautogui QT 5.12.12 QT开发环境 Ubuntu18.04 DenseNet bat ruby webview 漏洞报告生成 llamafactory 微调 Qwen BCLinux LLaMA-Factory NLP wpf dsp开发 BMS 储能 TraeAgent mysql 8 mysql 8 忘记密码 pytorch3d #笔记 DeepSeek-R1 API接口 银河麒麟桌面操作系统 Kylin OS TCP服务器 qt项目 qt项目实战 qt教程 大数据平台 音乐库 飞牛 MQTT协议 消息服务器 联机 僵尸毁灭工程 游戏联机 开服 lighttpd安装 Ubuntu配置 Windows安装 服务器优化 框架 raid Scoket 套接字 log4j RAGFLOW 检索增强生成 文档解析 大模型垂直应用 Ubuntu Server Ubuntu 22.04.5 Redis Desktop Ubuntu共享文件夹 共享目录 Linux共享文件夹 图文教程 VMware虚拟机 macOS系统安装教程 macOS最新版 虚拟机安装macOS Sequoia bpf bpfjit pcap openssh 编译器 I/O 设备管理 #tomcat #架构 #servlet 离线部署dify docker run 数据卷挂载 交互模式 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 mq 大模型技术 本地部署大模型 输入系统 AzureDataStudio compose rtc 蜂窝网络 频率复用 射频单元 无线协议接口RAN 主同步信号PSS Linux的进程概念 开发 软件安装 分类 #python #信息可视化 #大数据 #毕业设计 #Hadoop #SPark #数据挖掘 #n8n #n8n工作流 #n8n教程 #n8n本地部署 #n8n自动化工作流 #n8n使用教程 #n8n工作流实战案例 #php Invalid Host allowedHosts 做raid 装系统 BMC Flask Waitress Gunicorn uWSGI DeepSeek行业应用 Heroku 网站部署 nextjs reactjs 银河麒麟服务器操作系统 系统激活 黑客技术 存储数据恢复 raid5数据恢复 磁盘阵列数据恢复 freebsd 银河麒麟操作系统 联想开天P90Z装win10 ABAP 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? client close 弹性服务器 netty 内网渗透 靶机渗透 EtherCAT转Modbus EtherCAT转485网关 ECT转485串口服务器 ECT转Modbus485协议 ECT转Modbus串口网关 ECT转Modbus串口服务器 跨域请求 pxe ECS服务器 相机标定 粘包问题 USB转串口 GKI KMI cuda驱动 VUE Mysql 单用户模式 实习 curl wget 读写锁 rancher GRE VM虚拟机 桥接模式 windows虚拟机 虚拟机联网 web环境 冯诺依曼体系结构 gin CPU EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 WebRTC 带外管理 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 gateway Clion Nova ResharperC++引擎 Centos7 远程开发 智能音箱 智能家居 CNNs 图像分类 Webserver 异步 ftp proto actor actor model Actor 模型 英语六级 加密 键盘 支付 微信支付 开放平台 大版本升 升级Ubuntu系统 Linux find grep Linux的基础开发工具 powerbi JAVA Mac部署 Ollama模型 Openwebui 配置教程 AI模型 uni-app x PATH 命令行参数 main的三个参数 根目录 #DevEco Studio #HarmonyOS Next GoogLeNet composer 金仓数据库 2025 征文 数据库平替用金仓 ssh远程登录 输入法 自学笔记 小米 澎湃OS Linux系统编程 电子器件 二极管 三极管 #adb #数据库开发 #mysql #sql EMQX 通信协议 file server http server web server uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 asm 端口测试 金仓数据库概述 金仓数据库的产品优化提案 RK3568 匿名FTP 邮件传输代理 SSL支持 chroot监狱技术 socket mysql离线安装 mysql8.0 英语 export env 变量 泰山派 根文件系统 Linux的进程控制 react Native 源码软件 Ubuntu22.04 telnet 远程登录 Alexnet qps 高并发 IO 本地知识库 Playwright MCP 自动化测试框架 WebFuture 重构 c 阿里云ECS 镜像下载 配置原理 mvc cocos2d 3dcoat 全栈 Lenovo System X GNOME 观察者模式 小游戏 五子棋 MAC 移动端开发 Maven 数据库管理 nano direct12 octomap_server 实战项目 入门 精通 electron iptables #数据结构 #c++ #链表 目标跟踪 OpenVINO 推理应用 virtualbox LInux 4 - 分布式通信、分布式张量 软路由 AOD-PONO-Net 图像去雾技术 开启关闭防火墙 服务 c盘 磁盘清理 #计算机网络 #tcp/ip 大文件秒传跨域报错cors swoole 服务器主板 AI芯片 C# MQTTS 双向认证 emqx 支持向量机 pyscenic 生信教程 大厂程序员 硅基计算 碳基计算 认知计算 生物计算 AGI 系统架构设计 软件哲学 程序员实现财富自由 多媒体 笔记本电脑 医疗APP开发 app开发 代理服务器 开发人员主页 软链接 硬链接 高德地图 鸿蒙接入高德地图 HarmonyOS5.0 PostgreSQL15数据库 编译 烧录 #分区 #mobaxterm #termius #electerm #tabby #termcc AnythingLLM AnythingLLM安装 论文阅读 import save load 迁移镜像 命令模式 电脑操作 SSM 项目实战 页面放行 time时间函数 coze扣子 AI口播视频 飞影数字人 coze实战 UDP的API使用 ping++ 孤岛惊魂4 live555 源码剖析 rtsp实现步骤 流媒体开发 asp.net大文件上传下载 wsgiref Web 服务器网关接口 OD机试真题 华为OD机试真题 服务器能耗统计 Web应用服务器 deepseek-r1 大模型本地部署 券商 股票交易接口api 类型 特点 股票量化接口 股票API接口 文件存储服务器组件 web开发 教育电商 零日漏洞 CVE 网络IO 队列 数据库占用空间 磁盘IO iostat 医药 SPP csrutil mac恢复模式进入方法 恢复模式 grep win向maOS迁移数据 SPI Termius Vultr 远程服务器 #nacos Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 muduo库 青少年编程 编程与数学 思科实验 高级网络互联 #debian vasp安装 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 rtp W5500 OLED u8g2 小智AI服务端 xiaozhi TTS 动态规划 网站 软件开发 惠普服务器 惠普ML310e Gen8 惠普ML310e Gen8V2 DELL R730XD维修 全国服务器故障维修 messages dmesg #飞算Java炫技赛 #Java开发 Linux PID diskgenius 一切皆文件 导航栏 jdk11安装 jdk安装 openjdk11 openjdk11安装 热键 文件权限 linux常用命令 ubuntu18.04 子网掩码 公网IP 私有IP ceph WebVM 集成 聚类 能效分析 ipv6 光猫设置 路由器设置 vscode1.86 1.86版本 ssh远程连接 个人博客 VPS LORA VMware创建虚拟机 行情服务器 股票交易 速度慢 切换 java-zookeeper Putty 花生壳 网络带宽 问题排查 #合成孔径雷达 #GAMMA #InSAR conda配置 conda镜像源 Linux的权限 sublime text3 容器清理 大文件清理 空间清理 机床 仿真 课件 虚拟现实 教学 课程 苹果 体验鸿蒙电脑操作系统 Windows电脑能装鸿蒙吗 CAN总线 linux安装配置 免费域名 域名解析 Sealos 国产数据库 瀚高数据库 下载安装 图片增强 增强数据 netlink libnl3 su sudo sudo原理 su切换 finalsheel Unlocker 打包工具 filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 laravel googlecloud vSphere vCenter 聊天服务器 Socket 备选 调用 示例 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK 主板 电源 智能电视 nosql 免费 openvino GPU状态 bug定位 缺陷管理 决策树 服务器租用 物理机 lvm IP配置 netplan mac cocoapods macos cocoapods elementui 若依框架 进程创建 进程退出 #conda efficientVIT YOLOv8替换主干网络 TOLOv8 飞牛nas fnos deployment daemonset statefulset cronjob 电视剧收视率分析与可视化平台 post.io 企业邮箱 搭建邮箱 DrissionPage 链表 迭代器模式 dnn TiDB测试集群 vb 同步 备份 建站 服务器时间 创意 社区 能力提升 面试宝典 IT信息化 充电桩 欧标 OCPP ECT转Modbus协议 EtherCAT转485协议 ECT转Modbus网关 服务器部署 本地拉取打包 deepseak 豆包 KIMI 腾讯元宝 宠物 免费学习 宠物领养 宠物平台 分析解读 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 shell脚本免交互 expect linux免交互 Maxkb RAG技术 GRANT REVOKE Python学习 Python编程 云盘 安全组 端口 原创作者 vscode-server K8S k8s管理系统 IPv6测试 IPv6测速 IPv6检测 IPv6查询 linux子系统 忘记密码 本地环回 bind 服务注册与发现 xfce 图论 SVN Server tortoise svn hibernate java-rocketmq ardunio BLE 温湿度数据上传到服务器 Arduino HTTP 网络原理 光电器件 LED slave 雾锁王国 js逆向 序列化反序列化 EMUI 回退 降级 java毕业设计 微信小程序医院预约挂号 医院预约 医院预约挂号 小程序挂号 搜狗输入法 ai编程 #vue.js #ansible #role #galaxy #ansible-galaxy 烟花代码 烟花 元旦 copilot scapy Docker快速入门 docker安装mysql win下载mysql镜像 mysql基本操作 docker登陆私仓 docker容器 deepseek与mysql BitTorrent 搜索 2025一带一路金砖国家 金砖国家技能大赛 技能发展与技术创新大赛 首届网络系统虚拟化管理与运维 比赛样题 openGauss windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 雨云服务器 VS Code ueditor导入pdf ueditor导入ppt 腾讯云服务器 轻量应用服务器 linux系统入门 进度条 #vscode #编辑器 #ide #AI #MCP VR手套 数据手套 动捕手套 动捕数据手套 玩机技巧 软件分享 软件图标 keepalived 权限命令 特殊权限 Navigation 路由跳转 鸿蒙官方推荐方式 鸿蒙原生开发 ebpf #电脑 #经验分享 MDK 嵌入式开发工具 产测工具框架 管理框架 SSH 密钥生成 SSH 公钥 私钥 生成 抗锯齿 流水线 脚本式流水线 redhat MinIO huggingface dockercompose安装 compose.yml文件详解 dockercompose使用 PCB fork 进程管理 mcp-server #bright data #kubernetes #数据结构 网卡的名称修改 eth0 ens33 ssrf 失效的访问控制 junit 多个客户端访问 IO多路复用 TCP相关API 移动云 Dedicated Host Client 无头主机 显示管理器 lightdm gdm DOIT 四博智联 hugo gradle access blocked 破解 鼠标 Web测试 快速入门 #默认分类 基础环境 Cookie wait waitpid exit Tabs组件 TabContent TabBar TabsController 导航页签栏 滚动导航栏 systemctl 桶装水小程序 在线下单送水小程序源码 桶装水送货上门小程序 送水小程序 订水线上商城 leetcode CUDA Toolkit CentOS 影刀 #影刀RPA# ubuntu24 vivado24 k8s集群资源管理 实战案例 问题解决 富文本编辑器 solr 源代码 anythingllm open-webui docker国内镜像 高可用 openresty registries HBase分布式集群 HBase环境搭建 HBase安装 HBase完全分布式环境 proxy_pass 麒麟kos 网络检测 ping pi0 lerobot aloha act 人工智能作画 rtsp转rtmp 海康rtsp转rtmp 摄像头rtsp到rtmp rtsp转发 rtsp摄像头转rtmp rtsp2rtmp #stm32 #单片机 #freeRTOS 游戏机 DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 执法记录仪 智能安全帽 smarteye 繁忙 解决办法 替代网站 汇总推荐 AI推理 banner WebServer 蓝桥杯C++组 Qualcomm WoS QNN AppBuilder AimRT 三次握手 qwen2vl caddy 自定义登录信息展示 motd 美化登录 asp.net bootstrap RustDesk 搭建服务器 材质 贴图 #阿里云 Bluedroid #其他 信号 小艺 Pura X cmos vpn 高级IO epoll 用户管理 分布式总线 杂质 #VMware #虚拟机 #OCCT #Qt Linux环境 GRUB引导 Linux技巧 fabric 回归 network NetworkManager ROS1/ROS2 dockerfile Wayland #安全 #nginx #web安全 #udp #网络协议 #web安全 #网络安全 #渗透测试 #计算机 #转行 #职场发展 #干货分享 #arm开发 #嵌入式软件开发 MI300x 干货分享 黑客工具 密码爆破 加解密 Yakit yaklang oracle fusion oracle中间件 站群服务器 算法协商 故障排查 支付宝小程序 云开发 国产芯片 tengine web负载均衡 WAF proteus 基础入门 Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 线程安全 EulerOS 版本对应 Linux 发行版 企业级操作系统 RHEL 开源社区 #rockylinux #rhel #操作系统 #系统安装 TCP协议 并查集 lb 协议 hosts hosts文件管理工具 手机 nacos容器环境变量 docker启动nacos参数 nacos镜像下载 pavucontrol 蓝牙耳机 WIFI7 无线射频 高通 射频校准 射频调试 射频匹配 #经验分享 #chrome #redis #缓存 #macos 阻塞队列 生产者消费者模型 服务器崩坏原因 NAT转发 NAT Server UDP WinRM TrustedHosts Spring Security jetty undertow 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 IDEA sqlite3 skynet 矩池云 数据下载 数据传输 accept 环境 非root rtmp eventfd 高性能 视频服务器 访问公司内网 uv alias unalias 别名 termius iterm2 HarmonyOS NEXT 原生鸿蒙 Bandizip Mac解压 Mac压缩 压缩菜单 AppLinking 应用间跳转 文件清理 webgis cesium 程序地址空间 分布式锁 #机器人 多路转接 cd 目录切换 软负载 AI Agent 字节智能运维 CLion 钉钉 NLP模型 工具分享 Trae叒更新了? 触觉传感器 GelSight GelSightMini GelSight触觉传感器 BiSheng Jenkins 配置凭证 #openssh #电脑上不了网 #IP设置 #网卡驱动 #路由器设置 #wifi设置 #网络防火墙 #无法连接到这个网络 #网络协议 #ip #gpt #chatgpt 需求分析 并集查找 换根法 树上倍增 iDRAC R720xd 宕机切换 服务器宕机 技术共享 像素流送api 像素流送UE4 像素流送卡顿 像素流送并发支持 Qt QModbus AWS MateBook MQTT Broker GMQT funasr asr 语音转文字 ESP8266简单API服务器 Arduino JSON siteground siteground安装wp 一键安装wordpress 服务器安装wordpress 微信分享 Image wxopensdk trea idea 强制清理 强制删除 mac废纸篓 多产物 终端 空间 查错 cpolar 影视app 红黑树 CKEditor5 应急响应 CTF 系统升级 16.04 #矫平机 #校平机 #铁 #钢 IO模型 浏览器开发 AI浏览器 端口聚合 win11 windows11 UFW 静态IP 知行EDI 电子数据交换 知行之桥 EDI 数字比特流 模拟信号 将二进制数据映射到模拟波形上 频谱资源 振幅频率相位 载波高频正弦波 中文输入法 简单工厂模式 工作流自动化 AI智能体 线程同步与互斥 #database #爬虫 Radius webstorm code-server 软件定义数据中心 sddc XFS xfs文件系统损坏 I_O error MNN Erlang OTP gen_server 热代码交换 事务语义 算力 西门子PLC 通讯 超融合 代码托管服务 数字证书 签署证书 华为OD 可以组成网络的服务器 实时云渲染 云渲染 3D推流 anonymous Java 日志框架 Log4j2 Logback SLF4J 结构化日志 企业级应用 BIO Java socket Java BIO Java NIO Java 网络编程 pve 科研绘图 生信服务器 软件高CPU占用 ProcessExplorer Process Hacker System Informer Windbg 线程的函数调用堆栈 #哈希算法 #散列表 #ai #AI编程 服务网格 istio 自定义shell当中管道的实现 匿名和命名管道 Bluetooth 配对 C/C++ 底层实现 对话框showDialog showActionMenu 操作列表ActionSheet CustomDialog 文本滑动选择器弹窗 消息提示框 警告弹窗 嵌入式软件 RTOS CMake 自动化编译工具 Bilibili B站 HDC2025 HarmonyOS 6 #前端 #信息可视化 #qml #qt CAD瓦片化 栅格瓦片 矢量瓦片 Web可视化 DWG解析 金字塔模型 通用环境搭建 rxjava #部署配置docker #容器化 #kubernetes VPN wireguard c/s #STC8 #STM32 事件驱动 vue在线预览excel和编辑 vue2打开解析xls电子表格 浏览器新开页签或弹框内加载预览 文件url地址或接口二进制文档 解决网页打不开白屏报错问题 风扇散热策略 曙光 海光 宁畅 中科可控 独立服务器 #RAG springcloud 软件卸载 系统清理 查看显卡进程 fuser 互联网实用编程指南 本地不受DeepSeek CodeBuddy首席试玩官 时序数据库 iotdb mysql8.4.5 #Dify jina ubantu 恒玄BES 影刀证书 分享 scala #云原生 #阿里云 网络犯罪 人工智能 asi_bench opcua opcda KEPServer安装 KingBase 流量运营 联网 easyconnect 代理 错误代码2603 无网络连接 2603 MCP 服务器 JADX-AI 插件 EF Core 客户端与服务器评估 查询优化 数据传输对象 查询对象模式 aiohttp asyncio gpu alphafold3 KingbaseES #aws #搜索引擎 #elasticsearch #全文检索 regedit 开机启动 多层架构 解耦 safari etl 子系统 wifi驱动 ps命令 Windows应急响应 webshell 网络攻击防御 网络攻击 恢复 nvm安装 #Linux #Ubuntu #ubuntu24 #ubuntu2404 #ubuntu安装 #sudo WebUI DeepSeek V3 容器技术 Web3 Telegram 5分钟快速学 docker入门 代理配置 企业级DevOps sql注入 AI控制浏览器 Browser user Cilium 进程操作 理解进程 线性代数 AI agent SEO 社交电子 代码规范 zerotier 负载测试 OpenManage 报警主机 豪恩 VISTA120 乐可利 霍尼韦尔 枫叶 时刻 cordova 跨域开发 SpringBoot 视频直播物理服务器租用 物理服务器 物理机租用 selete 捆绑 链接 谷歌浏览器 youtube google gmail DIFY fonts-noto-cjk retry 重试机制 Office 顽固图标 启动台 端口开放 系统完整性 越狱设备 PDF 图片 表格 文档扫描 发票扫描 GDB调试 Ubuntu环境 四层二叉树 断点设置 南向开发 北向开发 MVVM 鸿蒙5.0 备忘录应用 #技能认证 #macos26 #启动台 docker部署Python 网易邮箱大师 机械臂 红黑树封装map和set NAT FCN 系统架构设计师 机床主轴 热误差补偿 风电齿轮箱 故障诊断 物理-数据融合 预测性维护 #网络通信 #Socket #飞书 RTMP 应用层 充电桩平台 充电桩开源平台 RNG 状态 可复现性 随机数生成 机器人仿真 模拟仿真 CSDN开发云 集群 元服务 应用上架 Attention 跨平台 提示词 broadcom 时间轮 coffeescript 云解析 云CDN SLS日志服务 云监控 解决方案 ICMPv6 requests python库 Searxng #nginx #性能优化 Excel转json Excel转换json Excel累加转json python办公 服务器部署ai模型 SysBench 基准测试 搭建个人相关服务器 服务器正确解析请求体 云耀服务器 浏览器自动化 海康 流量 Windows 11 重装电脑系统 参数服务器 分布式计算 数据并行 哥sika webserver webgl MacOS录屏软件 CentOS Stream qtcreator 命令键 C++11 lambda 包装类 HarmonyOS SDK Map Kit 地图 nmcli 效率 #计算机网络 #网络攻击模型 #sql #学习 #自动化测试 #软件测试 k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm 李心怡 达梦 DM8 ubuntu 18.04 docker search 智能问答 Milvus containerd 分布式数据库 集中式数据库 业务需求 选型误 VAD 视频异常检测 VAR 视频异常推理 推理数据集 强化微调 GRPO 最新微服务 物理层 实时语音识别 流式语音识别 myeclipse #图像处理 #端口 Wi-Fi SSL 域名 直流充电桩 矩阵 电商平台 clickhouse 架构与原理 域名服务 DHCP 符号链接 配置 shard rtcp AI导航站 zipkin cangjie openlayers bmap tile server 泛微OA #美食 #django #flask #node.js 魔百盒刷机 移动魔百盒 机顶盒ROM macOS 极限编程 玩游戏 nginx默认共享目录 Linux指令 路径规划 English arkts arkui infini-synapse FreeFileSync 定时备份 #http #小程序 #jvm docker 失效 docker pull失效 docker search超时 改行学it #mcp #浏览器自动化 #vue.js 根服务器 IPMITOOL 硬件管理 互信 云服务器租用 udp回显服务器 开闭原则 #系统架构 #数据库架构 #安全架构 navicat Ark-TS语言 bert 实时日志 logs clipboard 剪贴板 剪贴板增强 学习笔记 ohmyzsh skywalking #comfyui dock 加速 mapreduce 定义 核心特点 优缺点 适用场景 微信自动化工具 微信消息定时发送 扩展错误 #神经网络 #时序数据库 #物联网 #自然语言处理 #语言模型 #iotdb #重构 无法解析服务器的名称或地址 压测 h.264 查询数据库服务IP地址 SQL Server 相差8小时 UTC 时间 工业4.0 jQuery 事件分析 边缘服务器 利旧 AI识别 统信uos 转流 rtsp取流 rtmp推流 #c# #OPCUA 连接失败 Mosquitto 模拟实现 历史版本 下载 ollama下载加速 接口返回 Github加速 Mac上Github加速 Chrome浏览器插件 Ubuntu 24.04 搜狗输入法闪屏 Ubuntu中文输入法 android-ndk tvm安装 深度学习编译器 RHCE Eigen HarmonyOS 5开发环境 FreeLearning vmvare linux上传下载 docker命令大全 集群管理 usb typec vue2 敏捷开发 PP-OCRv5 ubuntu20.04 OCR NGINX POD #毕设 #租房管理系统 #论文 #目标跟踪 chfs ubuntu 16.04 授时服务 北斗授时 OpenAI 机架式 IDC 小亦平台 运维问题解决方法 gaussdb问题解决 #统信uos macbook 手动分区 Windows Hello 摄像头 指纹 生物识别 九天画芯 铁电液晶 显示技术 液晶产业 技术超越 视频号 黑马 苍穹外卖 黑屏 Win10修改MAC 查看 ss 交叉编译 WLAN uprobe scikit-learn isaacgym MobileNetV3 共享 设置 pow 指数函数 优化 概率与统计 随机化 位运算 几何计算 数论 ux URL sentinel 田俊楠 迁移指南 win服务器架设 windows server Async注解 动态域名 Modbustcp服务器 labview EasyTier #华为云 #测评 #CCE #Dify-LLM #Flexus #面试 #职场和发展 av1 电视盒子 合成模型 扩散模型 图像生成 threejs 3D gerrit 智能手表 Pura80 WATCH 5 redisson 安全整改 #云服务部署 #搭建AI #Flexus X实例 #后端 #jdk #编程 proxy模式 #PG处理POI分类数据 #Java处理POI分类数据 #ApachePOI数据处理 #高德POI分类数据存储 #POI数据分类存储 #golang sysctl.conf vm.nr_hugepages AISphereButler hexo 火山引擎 站群 多IP FS100P 虚拟主机 物理机服务器 食用文档 #笔记 #intellij-idea #idea #intellij idea #需求分析 #区块链 #数据分析 Mac软件 亲测 #WSL #截图工具 #驱动 #嵌入式 figma 语法 电子学会 集合 List 中文分词 #iotdb #时序数据库 #excel HAProxy 内网环境 业界资讯 xss Unity插件 安防软件 WINCC 制造 FreeRTOS 物理服务器租用 IT 护眼模式 mac完美终端 #进程优先级 #进程切换 #Linux调度算法 #寄存器 生活 ELF加载 idm N8N #数据库 #c语言 #程序人生 Nuxt.js 佛山戴尔服务器维修 佛山三水服务器维修 cpp-httplib 静态NAT 开启黑屏 协作 java18 #jenkins vsode 路由器 #Linux的基础IO 医院门诊管理系统 仓库 视频会议 细胞分割 计数自动化 图像分析 vscode 1.86 能源 pikachu靶场 XSS漏洞 XSS DOM型XSS #unity #着色器 #iot whistle mujoco 重置密码 激光雷达 镭眸 #shell #脚本 #VNC xpath定位元素 linux 命令 sed 命令 WinCC OT与IT SCADA 智能制造 MES #Agent #智能运维 #AI开发平台 #AI工具链 #rocketmq #零拷贝 高效I/O authing 模板 泛型编程 #spring boot Modbus TCP 基本指令 几何绘图 三角函数 UDS Bootloader #架构 #分布式 #单机架构 #微服务 #HTML #核心知识点 #web #知识点 #网页开发 #postgresql #Ollama #agent #向量库 #fastAPI #langchain #GESP C++ #C++程序竞赛 #洛谷 #信奥赛 恒源云 TrueLicense 选择排序 地平线5 服务器托管 云托管 数据中心 idc机房 #MCP协议 #typescript #实战指南 #MCP服务器 NTP服务器 #tensorflow #pip #node.js 项目部署 watchtower homeassistant #AI编程 #低代码 #pycharm #嵌入式硬件 lrzsz dos 批处理 日期 风扇控制软件 汽车 #CMake #Debian #CentOS OpenTiny #智能路由器 #NAT #信息与通信 #inlong #系统架构 tty2 mobaxterm #mc #服务器搭建 #mc服务器搭建 #mc服务器 #VMware #VMWare Tool cp 进度显示 #算法 #图论 #深度优先 责任链模式 #struts #echarts #强连通分量 #缩点 A2A 低成本 #腾讯云 #端口占用 #系统详情 fast 信奥 #react.js #javascript #React 编译器 #自动优化 #记忆化技术 #重新渲染优化 #https #虚拟地址空间 #进程 #fork #进程状态 #僵尸进程 #孤儿进程 #挂起 #RBAC桎梏 #角色爆炸 #静态僵化 #授权对象体系 #组织维度 #业务维度 #leetcode #elasticsearch guava SonarQube #开源 #AIGC #AI写作 #虚拟地址 #写时拷贝 #nginx配置 #nginx案例 #nginx详解 #tcp/ip #深信服运维安全管理系统 #远程命令执行漏洞 #intellij-idea #内网穿透 #音视频 #开源 #神经网络 #LoTDB #Apache IoTDB #eureka #DeepSeek #蓝耘智算 #微信小程序 #android #缓冲区 #Linux #gitlab #github #哈希表 #beego #go1.19 #beautifulsoup #list #stl #物联网 dfs #Cookie #Session #HTTP #github #Linux的进程间通信 #gitee #权限 #Linux的进程信号 #实时流处理 #设备故障预测 #Flink #深度学习 #概率论 #配置教程 #入门教程 #安装教程 #图文教程 #raid #raid阵列 #硬盘读取 #硬盘读取失败 #MAC电脑读取硬盘 #unix #Deepoc #具身模型 #具身模型开发板 #开发板 #机器人 #机械狗 #使用教程 #ruby #uni-app #微信小程序 #H5 #手机h5网页浏览器 #安卓app #苹果ios APP #手机电脑开启摄像头并排查 #限流算法 #Redisson #矩阵 #gpt #码上羽毛球馆 #羽毛球专业培训 #吴忠羽毛球学习俱乐部 #Fun-ASR # 硬件配置 # 语音识别 #信息安全 #密码破解原理 #John the Ripper #工作流 #SaaS #spring cloud #1024程序员节 #微信 #pytorch #C/C++ #Linux文件 #IO库 #Glibc #应用推荐 #WiFi Explorer #cpolar #moontv #oriontv #bash #eureka #Google Play #Android出海 #APP出海 #游戏出海 #短剧出海 #海外短剧 #出海开发者 #无人机 #边缘计算 #PyTorch #CUDA #cuDNN #串口服务器 #工业级串口服务器 #串口转以太网 #串口设备联网通讯模块 #串口服务器选型 #conda #3DGS #colmap #cuda #复现记录 #电脑 #课程设计 #jetson #PX4 #fastlio2 #ROS2 #LLM #llama #RAGFlow #本地化部署 #websocket #php #VS Code调试配置 #sci #sci收录 #信号处理 #langchain #rag #ai agent #ai智能体 #ai开发 #智能体开发 #大模型AI #计算机视觉 #opencv #轮廓检测 #模板匹配 #边缘检测 #智能手机 #USB共享 #共享上网 #手机热点 #游戏 #游戏引擎 #游戏程序 #laya #word #计算机图形学 #C++ #MFC #蓝桥杯 #stm32 #嵌入式硬件 #mcu #podman #创业创新 #百度 #wpf #网络防火墙阻止连接 #防火墙阻止连接网络 #阻止软件连接网络 #网络流量控制 #局域网连接 #允许程序访问网络 #命令行 #快捷键 #国产操作系统 #Linux桌面系统 #统信 #银河麒麟 #国产硬件平台 #国产CPU #软件开发 #生产排产 #APS排产 #生产管理系统 #chatgpt #eclipse #ai #YOLOv8 # 目标检测 # Docker镜像 #mybatis #mvc #vue #sglang #UU远程 #鸿蒙pc #lycium_plusplus #r语言 #flutter #交互 #OpenHarmony #跨平台开发 #训练营 #驱动开发 #MMC #SDIO #SD #EMMC #mid360 #livox #电容感应技术 #二代旋钮 #opencv #dnn #libwebkit2gtk-4.1-0安装 #智慧工地人员定位 #机器学习 #推荐算法 #RustFS #企业存储 #对象存储 #旅游 #旅游攻略 #景区讲解 #航拍 #5A级景区 #全国旅行 #走遍中国 #embedding #transformer #芯片制造 #3D动画 #芯片动画 #半导体3D动画 #bash #UOS #统信操作系统 #yum #数学建模 #预测模型 #matlab #css #css3 #html #agi #前端 #全栈 #日志分析 #公共MQTT服务器 #arm #策略模式 #mac mini #边缘算力 #知识库应用 #1024程序员节 #PATH #环境变量 #Lenyiin #spring #Linux开发 #系统编程 #文件IO #重定向 #运维开发 #autoware #其他 #GPS #北斗 #定位系统 #lbsfoft #智慧景区 #鸿蒙 #仓颉 #openvino #gitea #devops #ci/cd #新浪微博 #学习方法 #microsoft #负载均衡 #字符串 #保姆级教程 #strlen #strcpy #strcmp #sprintf #rs485 #挖漏洞入门到精通 #挖漏洞 #挖漏洞赚钱 #挖漏洞的平台 #挖漏洞赚钱合法吗 #挖SRC漏洞 #网络安全挖漏洞 #RPA #影刀RPA #AI工作流 #自动驾驶 #楼宇联盟 #楼宇运维 #测试工具 #azure #AI电商客服 #fastapi #postman #Terraria #游戏开服 #AI论文写作 #学术写作工具 #AI模型应用 #论文降重优化 #easyconnect #软件下载安装 #Xshell #powershell #软件需求 #程序 #nivida #CLion # STM32 # Mac开发 #flutter #鸿蒙开平台应用 #开源鸿蒙 #nvidia #mamba #wsl2 #环境配置 #Latex #论文写作 #AI顶会 #中小企业进销存 #象过河软件 #库存预警 #多仓库管理 #五金建材进销存 #五金建材管理软件 #鸿蒙系统 #系统降级 #华为P30 #可信计算技术 #生产者消费者模型 #线程同步 #阻塞队列 #流程图 #论文阅读 #量子计算 #AI大模型开发 #大模型应用 #AI测试 #AI智能体 #spark #课程设计 #hadoop #Z-Image #图片大模型 #图片生成 #开源图片生成 #开源无限图片生成 #开源免费图片生成 #转账 #提现 #unity #ShaderGraph #图形 #SimpleWood #信号处理 #fpga开发 #射频工程 #UltraScale+RF #rfdc #java-ee #概率论 #數學 #物理 #npm #贪心算法 #生活 #媒体 #oracle #paddlepaddle #ocr #权限提升 #postgresql #https #KMS激活 #ssl #wsl #音视频 #rtmp #单片机 #硬件工程 #本地部署AI #AI工具 #个人AI #IntelliJ IDEA #Spring Boot #muduo #TcpServer #accept #高并发服务器 #云计算 #夏天云 #夏天云数据 #spring #LangFlow # 轻量化镜像 # 边缘计算 #制造 #openwrt #编译 #环境 #hosts #芯片验证 #system verilog #远程工作 #excel #react native #react.js #arduino下载安装教程 #milvus #人机交互 #健康医疗 #clawdbot #electron #microsoft #鸿蒙PC #Antigravity #材料工程 #密码学 #GRUB #国内源 #openhands #AI 软件开发代理平台 #本地部署 #mysql #CVE-2017-7494 #linux永恒之蓝漏洞 #中级 #系统集成项目管理工程师 #软考 #King Base #镜像构建 #OpenJDK #OpenJDK部署 #docker部署OpenJDK #OpenJDK部署文档 #OpenJDK部署教程 #科技 #UWB #智能家居 #超宽带 #pandas #pycharm #经济学 #ffmpeg #生活 #聊天小程序 #nvidia #显卡驱动安装 #rabbitmq #sqlite #ssh #ext2文件系统 #硬件 #inode #音频格式转换 #视频格式转换 #音视频格式转换 #格式转换软件 #pdf #AI赋能 #spring cloud #中间件 #内容管理系统 #网站管理系统 #企业建站 #企业网站建设 #CMS #网站建设 #网站制作 #单元测试 #语音识别 #lstm #命令行参数 #策略模式 #AI系统 #Reactor #epoll #ET模式 #非阻塞 #rpa #AI自动化 #dlms #dlms协议 #逻辑设备 #逻辑设置间权限 #bug菌问答团队 #京东云 #国产操作系统 #麒麟 #V11 #kylinos #taro #软件 #本地生活 #电商系统 #商城 #产品经理 #程序员 #数字营销 #seo #多进程 #python技巧 #怎样查看MAC地址 #MAC地址查看方法 #手动签名 #自定签名 #gitblit #数信院生信服务器 #r语言 #mongodb #MacOS #鸿蒙 #ArkTS #Flutter #移动开发 #跨平台 #重构 #能源 #计算机外设 #鼠标 #ui #汇编 #Linux时间同步 #手动同步 #CP2K #量子化学 #vivado安装包 #ue5 #游戏引擎 #开源软件 #鸿蒙NDK UI #关键帧动画 #标尺 #标杆 #矿 #煤 #数据集 #随机森林 #遥感 #GEE #土地利用 #arm开发 #k8s #libusb #ios #iphone #学习 #数据仓库 #css #Linux包管理 #yum教程 #apt入门 #建站 #部署 #cpolar #手持气象站 #电子气象仪 #支持向量机 #zTasker #人脸核身 #thinkphp #腾讯人脸核身SDK #ABAQUS #abaqus教程 #达索仿真 #计算机毕业设计 #计算机专业 #选题推荐 #源码分享 #计算机毕设 #个人开发 #JDK17 #jdk21 #节点小宝 #远程访问 #NAS #网关 #工具 #车载系统 #系统安全 #rknn-toolkit2 #Dynamics 365 #考研 #claude #android studio #爬虫 #JS #数据分析 #Excel技巧 #图表设计 #职场技能 #办公技巧 #效率神器 #自动化工具 #Windows技巧 #打工人必备 #大模型学习 #大模型教程 #新手入门 #微服务 #高并发 #大流量 #微服务性能 #中台 #零售中台 #laravel #政务 #nanobanana #AITOP100工具 #AI资讯 #AITOP100 #neo4j #进程控制 #etcd #bootstrap #3d #visual studio #经济学 #z-image base整合包 #z-image整合包下载 #z-image生图 #z-image文生图 #z-image最新整合包 #ai文生图 #z image base #办公软件 #html5 #前端开发 #免费教程 #手搓音乐播放器 #代码案例 #asp.net #蓝桥杯 #HeyGem # 远程访问 # 服务器IP #Jetty # CosyVoice3 # 嵌入式服务器 #联机教程 #局域网联机 #局域网联机教程 #局域网游戏 #ppt #powerpoint #YOLO26 #智能体搭建 #强化学习 #知识图谱 #大模型工程师 #leetcode # HiChatBox # 离线AI #蓝牙 #LE Audio #BAP #SSH # 代理转发 # 跳板机 #cnn #Triton # PyTorch # CUDA #高级IO #poll #脚本 #HarmonyOS6.0 #Resuable #组件复用 #ArkUI #mmu notifier #mmu_notifier #invalidate_seq #amdgpu svm #分布式 #鸿蒙2025领航者闯关 #开发者年度总结 #具身智能 #Ubuntu #向日葵 #麒麟2503 #统信UOS #国产化 #远程控制 #哲学 #交友 #android studio #通信 #rust #vmware #win11 for Arm #程序人生 #激光雷达 #模拟器 #arcgis #文件I/O #系统文件 #系统调用 #html5 #软件工程 #张量 #组合导航 #精准农业 #低成本组合导航 #MEMS #Burpsuite #Burpsuite漏洞扫描 #Burpsuite网络抓包 #Burpsuite实战教程 #Burpsuite入门到精通 #Burpsuite安装教程 #Burpsuite渗透测试 #AI大模型 #vim #Android开发 #Android开发所属操作系统 #matlab #电路板上电子元件检测检测系统 #YOLOV8 #EasyConnect下载安装 #EasyConnect下载 #SSL VPN #远程办公 #驱动开发 #DIY机器人工房 #ros2 #moveit #YOLO #运维 #服务器 #selenium #xss #压力测试 #迭代加深 #Linux网络 #IP地址 #MAC地址 #TCP/IP协议 #网络传输流程 #go语言 #医学图像分割 #CNN #Transformer #人工智能论文 #新人首发 #aws #云服务 #金融 #TradingView #PostgreSQL部署 #PostgreSQL部署文档 #PostgreSQL部署方案 #PostgreSQL部署教程 #Python #量化软件 #PTrade #QMT #量化交易 #量化炒股 #deepseek #企业微信 #5G #EAP #MES #chrome devtools #信号产生 #键盘 #软件条件 #qwen3-vl #语言模型 #rabbitmq #mybatis #远程工作 #组合模式 #html #c# #壁画 #烟熏壁画 #壁画修复 #烟熏壁画修复 #壁画保护 #文物修复 #文物保护 #bug #就业 #Ubuntu24.04LTS #远控端黑屏 #远控端不能登录 #软件推荐 #Linux运行Win程序 #平面 #pdf #SEW变频器 #影刀rpa教程 #影刀rpa #教程 #信息与通信 #亚马逊申诉 #跨境电商 #亚马逊 #ubuntu升级 #远程更新 #缓存更新 #多指令适配 #物料关联计划 #Power Platform #typescript #type-challenges #源代码管理 #北京百思可瑞教育 #百思可瑞教育 #北京百思教育 #东方仙盟 #webrtc #turn #oracle #Tracker 服务器 #响应最快 #torrent 下载 #2025年 #Aria2 可用 #迅雷可用 #BT工具通用 #状态模式 #Qwen3-14B # 服务器迁移 # 回滚方案 #n8n #nodejs #session #网络编程 #pxe #海外服务器安装宝塔面板 #网络配置实战 #Web/FTP 服务访问 #计算机网络实验 #外网访问内网服务器 #Cisco 路由器配置 #静态端口映射 #网络运维 #面试 #gateway #SA-PEKS # 关键词猜测攻击 # 盲签名 # 限速机制 #sv #芯片 #CosyVoice3 # IP配置 # 0.0.0.0 #golang #智能手机 #设计模式 #electron #wpf #数学建模 #orbstack #prompt #时间频率传递 #光学 #计量 #时间频率计量 #光频梳 #光学频率梳 #双系统 #清理 #pygame #virtualenv #plotly #进程终止 #app #组件 #数据 #迁移学习 #makfile #C++开发 #GMU Make #EtherCAT #速腾聚创3d激光雷达使用 #能源 #能源管理 #能源监测 #大学生 #大作业 #二叉树 #深度优先搜索 #广度优先搜索 #DFS #BFS #spark #日志 #池化技术 #Claude Code #实战 #Skill #Portainer #远程 #物理 #数学 #时空 #狭义相对论 #广义相对率 #旋转磁体 #docker搭建mysql主从 #docker 搭建mysql #mysql主从搭建 #mysql主从 #mysql主从搭建详解 #vuejs #RK35588 #线程池 #空间隔离 #镜像仓库 #智慧工地人员定位系统 #统一白名单控制 #edge #实时音视频 #音频策略 #Audio Policy #音频架构 #智能仓储 #仓储未来 #自动化仓库 #设备选型 #堆垛机 #穿梭车 #AMR #Linux用户管理 #权限控制 #用户管理 #Linux安全运维 #智能充电桩 #自动化枚举 #WinPEAS #知识图谱 #vllm #gradio #api #mineru2.7.1 #docker compose #Bacteria #2025年终总结 #微信 #节点小宝 #JSR-107 #java高级面试 #容量规划 #故障诊断 #成本控制 #传感器 #霍尔电流传感器 #光伏逆变器 #生产服务器问题查询 #日志过滤 #论文阅读 #自动驾驶 #护网行动 #nas #gitlab #TFTP #客户端 #copilot #存储 #GPU #算力建设 #ms-swift # 一锤定音 # 大模型微调 #游戏服务器断线 #在线考试系统 #考试系统 #考试管理系统 #SPA #单页应用 #虚幻 #ue5 #Ascend #MindIE #内存接口 # 澜起科技 # 服务器主板 #黑客技术 #文件上传漏洞 #小程序 #risc-v #kmeans #聚类 #MinIO服务器启动与配置详解 #HarmonyOS App #Shell #ocr #websocket #三层架构 #多端部署 #一多适配 #LED数码管生产厂家 #数码管 #LED数显屏 #七段数码管 #网上点餐系统 #Java毕业设计 #java毕设 #计算机专业毕业设计 #java源代码 #uni-app #worker #reportRealtimeA #微信小程序报错 #uniapp微信小程序 #微信开发者工具编译报错 #hive #应用层 #arcgis #Linux的Ext系列文件系统 #线性导轨 #直线模组 #线性回归 #Miniconda # Conda # 环境变量 #鸿蒙2025领航者试炼 #生态 #cangjie #基础入门 #基础知识 #信号捕捉 #Linux入门 #asp.net #爬虫实战 #零基础python爬虫教学 #动态列表 #滚动加载采集条数 #Python爬虫工程化实战 #鸿蒙领航者计划 #SOEM #EtherCAT主站 #eclipse #qt #深度相机 #realsense #vins #dify部署 #journalctl #aarch64-linux #arm交叉编译工具 #pyenv #多版本 #虚拟环境 #Anaconda #python3.11 #政务 #idapro下载 #录屏 #record #node #scrapy #nosql #nosql数据库 #学工管理系统 #学工一体化平台 #学生综合管理系统 #学生工作管理平台 #学工软件厂家 #学工系统解决方案 #自友学工管理系统 #iot-tree #IIoT #rpc #共享内存 #System V #ubuntu22.04 #Fast_livo2 #静态库 #numpy #影刀RPA #流程自动化 #智能运营 #数字化转型 #效率提升 #ansible #工具箱APP #手电筒APP #指南针APP #水平仪APP #分贝仪APP #无广告工具箱APP #工具箱APP开发 #django #gazebo #ros #宇树Go2 #仿真 #.net #.netcore #k8s #MinIO #QGC安装 #AI转型 #AI大模型工程师 #C语言 #模数电 #AutoGen #AutoGenStudio #asp.net大文件上传 #asp.net大文件上传下载 #asp.net大文件上传源码 #ASP.NET断点续传 #asp.net上传文件夹 #asp.net上传大文件 #.net core断点续传 #网络共享 #映射网络驱动器 #tcpdump #华为od #华为OD机试真题 #华为OD机考 #华为OD上机考试 #华为OD机试双机位C卷 #华为OD机考双机位C卷 #个人开发 #jmeter #Ping不通 #Zibll主题页脚美化 #textln #coze #AIGC #企业经营 #盈利 #销售额 #成本 #利润 #流动资产 #固定资产 #autosar #zabbix #网络安全 #信息安全 #windows日志 #kylin #NSP #下一状态预测 #aigc #pandoc #markdown #VSCode #MPE #mdev #udev #电脑网卡驱动下载 #协议定制 #JosnCpp库 #序列与反序列化 #毕业设计 #程序开发 #程序设计 #源码 #线性回归 #回归 #pytest #模型 #训练 #vivado2020.2安装教程 #好物分享 #低代码平台 #低代码搭建OA系统方法 #低代码OA系统实用技巧 #低代码OA系统关键考量 #TPFLOW工作流引擎应用案例 #Gadmin低代码平台优势 #gadmin #lbssoft #gin #go # CSPDarknet #决策树 #JSR-107 #缓存雪崩 #缓存击穿 #随机过期时间 #缓存高可用 #降级和熔断 #Llama-Factory # 树莓派 # ARM架构 #流量监控 #云服务器操作系统 #服务器系统 #Dify #轻量化 #低配服务器 #FaceFusion # Token调度 # 显存优化 #SSH #远程开发 #麦克风权限 #访问麦克风并录制音频 #麦克风录制音频后在线播放 #用户拒绝访问麦克风权限怎么办 #uniapp 安卓 苹果ios #将音频保存本地或上传服务器 #SSH跳板机 #PyTorch #入职背调 #企业背调 #背调 #ceph #改行学it #创业创新 #程序员创富 #文件描述符 #ssl #改进 #RustDesk # IndexTTS # GPU集群 #项目 #RXT4090显卡 #RTX4090 #深度学习服务器 #硬件选型 #AI智能棋盘 #Rock Pi S #环境搭建 #通信工程师 #初级通信工程师 #中级通信工程师 #高级通信工程师 #通信工程师备考资料 #毕设定制 #毕设代做 #程序定制 #蓝耘元生代 #缓存 #鸿蒙6实战 #媒体 #虚拟串口 #ollama #大模型基础 #简单的大模型部署 #实现ollama模型调用 #AI 聊天机器人 #零基础上手 Ollama体验 #vivado2023.2下载安装教程 #BI #BI选型思考 #gaussdb #opengauss #青少年编程 #递归 #HarmonyOS6.0 #鸿蒙6.0 #文本折叠 #折叠 #服务发现 #FlashAttention #flash_attn #flash-attn #FlashAttention2 #FlashAttention3 #KingbaseES #电科金仓 #国产数据库 #Ubuntu安装 #Oracle #编辑器 #Flutter运行到鸿蒙 #有限元仿真 #Abaqus软件教程 #ODOO #开源ERP #ODOO社区版 #ODOO企业版 #k8s集群 #adobe #Affinity #版本控制 #Git入门 #开发工具 #代码托管 #备份 #松鼠备份 #数据备份 #自动备份 #中小企业 #防勒索 #FHSS #transformer #共绩算力 #模版 #函数 #类 #笔试 #opengl #水印 #录制 #Leecode #Fcitx #零基础 #DSP ##素数注意力机制 ##稀疏Tranformer ##数论机机器学习 ##黎曼编码 ##数学神经网络 ##长序列建模 ##算法数论 #TCP协议 #Docker MySQL部署 #MySQL 8.0容器化 #MySQL远程访问配置 #Docker数据卷挂载 #实验室 #uboot #设备树 #devops #Arbess #PostIn #docker镜像 #docker镜像源 #docker镜像加速 #docker镜像下载 #docker国内加速 #adb #appium #sentinel #hibernate #codex #kimi-k2 #codex cli #glm-4.6 #数码相机 #模拟退火算法 #教程 #扣子技能 #Agent Skills #Coze #prometheus #grafana #监控 #域名 #url #网址 #浏览器 #链接 #超链接 #DNS #ros #集合框架 #论文降重 #论文降AI率 #降AI技巧 #论文修改 #降AI率工具 #CentOS 7 #yum 源 #国内镜像源 #阿里云镜像 #EPEL #Base 源 #Linux 运维 #无人机 #ADS 自动化仿真 #ADS 程控 #ADS python #CCE高可用 #云服务器单机部署 #DeepSeek商用开通 #Windows 11 #TPM #Secure Boot #CPU #RAM #OOBE #网络验证 #Java #JVM #类加载 #类初始化 #双亲委派 #内存管理 #安全漏洞 #智能路由器 #AI-native #语音识别 #vlan #独臂路由 #DHCP #RK3588 #无人机工地巡检 #挖掘机识别 #叉车识别 #立即下载 #智能硬件应用 #UI #AgentSkills #skills #深度优先 #mtgsig #美团医药 #美团医药mtgsig #美团医药mtgsig1.2 #ib #Ubuntu22.04 #安卓屏幕触控 #屏幕触控 #Android touch #安卓系列 #开发 #企业开发 #ERP #项目实践 #.NET开发 #C#编程 #编程与数学 #网站 #SpringBoot #Raft #DS随心转 #低代码 #restful #AudioPolicy #APS #安卓音频 #mqtt #经管科研 #rust #汽车 #SeaTunnel #DeepSeek #娱乐 #pyqt #CANN训练营 #Linux应用层开发 #应用层开发 #dup函数 #博客之星 #select #期刊 #SCI #kubuntu #Lubuntu #Xubuntu #redhat #黑群晖 #无U盘 #纯小白 #内网穿透 #ngrok # Triton #投票 #微信投票 #线上投票 #投票系统 #大模型部署 #mindie #大模型推理 #Cpolar #国庆假期 #服务器告警 #debian #mariadb #Node.js # child_process #unity3d #服务器框架 #Fantasy #Langchain-Chatchat # 国产化服务器 # 信创 #昇腾300I DUO #kylin #homelab #Lattepanda #Jellyfin #Plex #Emby #Kodi #LoRA # RTX 3090 # lora-scripts #算力一体机 #ai算力服务器 #Docker #云计算运维 #fabric #Ansible # 自动化部署 # VibeThinker #Minecraft #我的世界 #Minecraft服务器 #PaperMC #我的世界服务器 #宠物 #温湿度二氧化碳三合一传感器 #LORA三合一传感器 #LORA室内环境传感器 #NDIR 二氧化碳检测 #无线环境监测 #低功耗广域网环境监测 #Syslog #系统日志 #日志监控 #ddos #dubbo #CVE-2025-61686 #漏洞 #路径遍历高危漏洞 #wordpress #软件需求 #UDP服务器 #recvfrom函数 #fastmcp #http #旅游 #DataGrip #gnu #parallel #FreeRTOS #移植 #API #函数使用 #todesk #virglrenderer #virtio-gpu #进度条 #Claude Code #Gemini #串口 #同步通信 #异步通信 #通信方式 #arkui #组件库 #AI技术 #kfifo #流程图 #单例模式 #懒汉模式 #LINUX系统 #硬件架构 #TCP/IP #三次握手 #网络排查 #团队开发 #查重率 #降AIGC率 #进程替换 #systemd #key #API调用 #AI作画 #Trae #logback #pcb工艺 #数码相机 #智能问数 #ELF #静态链接 #kvm #虚拟化 #hypervisor #Stage模型 #鸿蒙开发 #软件 #win #edge #零售 #SAP #Claude code #2026降AI工具第一梯队 #降AI工具TOP5 #MarkText #mark text #marktext #marktext下载 #marktext 中文 #视频 #人形机器人 #csp #提高组 #csp-s #高频考点 #知识 #鸿蒙6.0 #V2装饰器 #once #wps #软件安装 #无名杀 #单例模式 #线程安全 #重入问题 #死锁 #饿汉模式 #Sequoia #sqlite #多线程 #pthread #线程互斥 #springboot项目 #java毕业设计 #校园资料分享平台 #ethernet-phy #LazyForEach #懒加载 #分页渲染 #list #真题 #谐音替换 #分布式数据库 #云端 #云DB #ComfyUI #文生图工作流 #后端 #Java编程 #Java面试 #Java程序员 #信息收集 #Kali Linux #黑客 #黑客工具 #昇腾平台 #大模型推理调优 #SGLang #利用率优化 #vllm-ascend #Atlas 800T A2 #NPU #PuTTY #排序算法 #Kanass #国产开源项目管理工具 #一文上手 #visual studio #gitcode #WinSCP 下载安装教程 #SFTP #FTP工具 #服务器文件传输 #空间计算 #Linux内核 #调度算法 #AINode #nomachine #远程连接 #Python环境管理 #Miniconda教程 #Autoware #Nvidia #安全性测试 #Dockerfile #镜像 #数据采集 #SECE-I串口设备 #半导体SECS-I串口协议 #上位机SECS #上位机SECS协议串口设备 #PLC半导体SECS协议 #PLC与SECS协议 #m3u8 #视频播放报错 #M3U8文件 #文件异常 #video视频组件 #第三方视频播放器 #ci/cd #exec系列 #进程程序替换 #开源AI #crontab #定时任务 #Cron 表达式 #Shell 脚本 #实战案例 #Docker #服务器部署Docker #云主机部署Docker #Hudi #OkHttp #Retrofit #CSDN #Nginx #视觉大模型 #信息收集 #毕业论文 ## 论文写作 ##科研干货 ##论文技巧 #国企混改 #央企混改 #国企混改咨询 #ai写作 #测试用例 #aippt #ChatPPT #微信公众平台 #AI生成图像 #生成图像检测 #AIGC检测 #生成图像检测评测 #redis-cluster #gossip协议 #缓存集群 #AI #实时检测 #卷积神经网络 #页面 #论文笔记 #国产 #iphone #网络原理 #IP #协议 #OSI七层网络模型 #人形机器人 #Windows #MySQL #数据库管理 #服务器运维 #图像处理 #学术会议 #生物医学 #医学 #练习 #基础练习 #OOP #restful #ajax #js #deepseek api #平板电脑 #Python从手机读取电话声音 #AI外呼机器人 #AI电话外呼 #Python源代码AI外呼 #智能拨号器APP #智慧城市 #n8n短视频工作流 #n8n监控 #n8n自动化 #n8n爆款公众号 #dfs #电商 # 自动化运维 #ddos #银河麒麟高级服务器操作系统安装 #银河麒麟高级服务器V11配置 #设置基础软件仓库时出错 #银河麒高级服务器系统的实操教程 #生产级部署银河麒麟服务系统教程 #Linux系统的快速上手教程 #Puppet # IndexTTS2 # TTS #FASTMCP #ESP32 # OTA升级 # 黄山派 #umeditor粘贴word #ueditor粘贴word #ueditor复制word #ueditor上传word图片 #dba #SSH密钥 # IndexTTS 2.0 #扩展屏应用开发 #android runtime #性能优化 #openEuler #fpga开发 #myeclipse #数据安全 #注入漏洞 #jupyter #流媒体 #飞牛NAS #NVR #EasyNVR #SEO优化 #mysql集群 #MCP #cursor #课设 #gpu算力 #gmssh #宝塔 #1panel #私域运营 #流量运营 #新媒体运营 #ARM架构 #x86_64 #数字人系统 #Gateway #认证服务器集成详解 #elementui #WAF #D盾 #哥斯拉 #系统安全 #SSH Agent Forwarding # 容器化 #.netcore #vLLM #高可用 #VoxCPM-1.5-TTS # 云端GPU # PyCharm宕机 #设计模式 #esb接口 #走处理类报异常 #小灰一键去水印 #试卷网资源下载器 #小学试卷下载器 #初中试卷下载器 #高中试卷下载器 #学习试卷下载器 #制造 #lua #透明免抠设计素材 #PNG素材 #设计师素材 #人物素材 #科技素材 #婚庆素材 #图片素材 #软件构建 #TCP服务器 #语音控制 #应急救援平台 #进程等待 #wait #waitpid #Mac #mac使用z-image #z-image mac怎么安装 #mac怎么使用z-image #mac ai生图 #mac电脑使用z-image #macbook 生图 #Todesk #OBS #抖音直播 #PD虚拟机 #mac直播 #z-image 苹果芯片版 #z-image mac #z-image-turbo整合 #z-image苹果电脑怎么安装 #macbook用z-image #mac电脑安装z-image #z-image mac版 #slam #fast_lio2 #建图 #重定位 #RHEL #rk3588 #VPN #网络连接 #代理服务器 #main函数参数 #怪奇物语 #windows优化工具 #禁止win11更新 #hibernate #静态IP #宽度优先 #bfs #信号机制 #ARM #嵌入式开发 #管道Pipe #system V #同花顺 #ubuntu24 #workstation #25H2 #问题 #esp32 #jtag #串口 #计算机外设 #沙盒隔离 #程序多开 #安全测试环境 #Windows应用隔离 #免费沙盒工具 #开发测试防护 #数据治理概论 #数据治理框架 #数据战略规划 #数据存储 #数据治理价值评估 #脚本语言 #fast_livo #llamafactory #分布式训练 #调优算法 #微调 #openstack #蓝耘容器云 #团队领导 #团队开发 #大模型入门 #智能体 #linux应用层 #iRMB #视觉检测 #浏览器开发 #chrome devtools #指纹浏览器 #Linux指令 #maven #鸿蒙PC #响应式布局 #命名管道 #磁盘清理 #企业转型 #Rag #鸿蒙系统 #llm #第三方检测 #软件检测 #检测方法 #初学者 #pencil #pencil.dev #设计 #ur5 #robotiq #机械臂 #MobaXterm #文本编辑 #远程管理 #scp #哈希算法 #408真题解析 #计算机考研 #零售 #2026年 #交换机 #三层交换机 #p2p #阐明原理 #给出标准方案 #提供编程方案 #提及根本解决 #结合主流框架 #办公神器 #效率工具 #财务自动化 #发票管理 #职场干货 #批量处理 #交换机 #shell #命令行解释器 #Linux系统编程 #anaconda #Ubuntu 20.04 安装 #编译避坑 #PX4+Gazebo #Mid360 #ollama #望获 #瑞芯微 #Isaac Sim #IsaacSimAssets #Ubuntu 24.04 #基础指令 #集群 #KingbaseES部署工具 #嵌入式系统开发 #加速 #IoTDB #Kubernetes #pull #commit #hun #分层 #unionFS #Qwen3-32B # 生物信息学 # 大语言模型 #边缘计算 #AI推理 #低延迟网络 #busybox #java-rabbitmq #mojo #网络示识别 #网络未识别问题 #CSDN成长记录 #MC.JS #WebGL #WebAssembly #前端技术 #X11转发 #远程图形 #青少年编程 #讲义 #教材 #考级 #竞赛 #蓝耘MaaS平台 #ROS #AI智能体 #自定义插件 #API集成 #工具调用 #大模型落地 #内建命令 #金仓数据库 #ubuntu24.04 #远程桌面 #桌面共享 #量子计算 #火山引擎 #three.js #前端框架 #网路规划设计 #IPsecVPN #网络工程师 #eNSP综合实验 #医院网络规划 #网络规划 #可控AI #Cgroup #docker-compose #项目部署 #Kontakt #Kontakt8 #Kontakt7 #Kontakt6 #Kontakt音源 #音源下载 #facebook #twitter #oneapi #JS逆向 #Python学习 #Python零基础 #看漫画学Python #PythonPDF教程 #AI产品经理 #memcached #信号 #非阻塞等待 #nio #express #线程状态 #线程 #流量运营 #用户评论 #geant4 #AutoDL #Pixhawk #电机 #电调 #DoS攻击实操 #hping3 #开源软件 #网盘 #openlist #WebDAV #正则表达式 #编译原理 #亮数据 #城市交通 #AI应用开发工程师 #接单 #平台 #Topcoder #miniconda #vp9 #nas #机顶盒 #hive #json #package #量化 QMT Ptrade #PCB设计 #道德经 #路由器 #宽度优先 #CVE-2025-27817 #CVE-2025-27818 #CVE-2025-27819 #远程代码执行 #编程开发 #架构师 #第三方检测 #web3 #去中心化 #ERC标准 #EIP #事务ACID #Commit Rollback #数据库入门 #后端开发 #数据一致性 #集成测试 #langchain4j #2026年美赛C题代码 #2026年美赛 #短剧H5 #短剧H5开发 #短剧平台开发 #短剧 #短剧h5 #h5开发 #短剧系统开发 #分类 #广告联盟APP开发 #广告联盟APP #广告联盟对接 #广告联盟 #APP开发 #看广告app开发 #广告app开发 #ai大模型 #无线网络 #AI论文写作 #论文创作提效 #AI写作功能解析 #LTC #FOC #电机控制 #AIGC实战 #多模态人工智能 #生成对抗网络 #时间同步 #NTP #Cron #notepad++ #像素流 #命令模式 #serverless #数据报系统 #emqx #elk #mcu #戴尔服务器 #戴尔730 #装系统 #微信支付 #收付通 #esp32教程 #VSCode # 远程开发 # Qwen3Guard-Gen-8B #业界资讯 #openHiTLS #TLCP #DTLCP #商用密码算法 #java大文件上传 #java大文件秒传 #java大文件上传下载 #java文件传输解决方案 #IndexTTS 2.0 #漏洞修复 #IIS Crypto #SSH复用 # Miniconda #套接字 #I/O多路复用 #字节序 #nmodbus4类库使用教程 #NeurIPS #ICML #ICLR #机器学习顶会 #学术投稿 #会议文化 #顶会顶刊 #数信院生信服务器 #Rstudio #生信 #Domain Fronting #域前置 #协议特性 #链路设计 #银河麒麟服务器系统 #欧拉 # 服务器IP配置 #主从式Reactor #仿muduo高并发服务器 #linux操作系统 #http网络协议 #epoll eventfd #timerfd pthread #flask #C++ UA Server #SDK #Windows #claude-code #ai编程 #软件开发 #CSDN镜像 #googlecloud #vnstat #rdp #SSH跳转 #GPU服务器 #ENSP #实验 #从零开始 #倍增 #树链剖分 #邻接表 #Android #Bluedroid # ARM服务器 # 大模型推理 #c #Rust #EN4FE #软件工程 #CNAS #CMA #38634 #spring ai #oauth2 #ribbon # 高并发 #jquery #怎么写论文 #论文写作技巧 #光伏 #光伏产业 #梁辰兴 #新材料 #新突破 #大模型开发 #目标检测 #星图GPU #AI应用 #ambari #并发 #Shiro #反序列化漏洞 #CVE-2016-4437 #51单片机 #UClinux #内存 #性能 #优化 #DDR #VMware Workstation16 #服务器操作系统 #SIP服务器 #语音服务器 #VoIP #SIP协议 #b树 #go #dynadot #域名 #bug # 服务器配置 # GPU #求职招聘 #云服务器选购 #Saas #以太网 #Go并发 #高并发架构 #Goroutine #系统设计 #InfluxDB #与TimescaleDB #的适用场景 #代码 #新手 #java基础 #react #blob #电机驱动 #TMC2240 #web3 #CNSH 中文编程 #notion #UID9622 #firefox #容器 #镜像 #DNS #车用接插件的装配说明 #贪心算法 #二分 #视觉检测 #线程操作 #进程地址空间 #系统调用号 #线程崩溃 #嵌入式系统开发 #Laplace #Laplace边缘提取 #教程4 #openharmony #资源划分 #HarmonyOS 6 #鸿蒙6 #远程控制工具 #心理健康测评 #心理测评 #心理咨询 #AI 量表测评系统 #心理评估 #ffmpeg #交叉编译 #KingBaseES #WSL2 #安卓 #旅游网站 #旅游管理系统 #云南旅游网站 #51单片机 #联合体 #共用体 #枚举 #typedef #位运算 #门禁 #梯控 #电梯门禁 #智能梯控 #智能一卡通 #CPU卡梯控 #CPU卡门禁 #动环监控系统 #机房管理系统 #机房运维 #豆包 #tornado #perl #sql注入 #动态库 #存储维护 #EMC存储 #ida #远程调试 #内核 #实例分割 #自动标注 #MicroPython #Python #传感器 #Android #GATTC #进程调度 #驱动安装 #英伟达驱动 #nvidia驱动安装 #tar #navicat #预处理 #函数调用 #Makefile #具身智能 #rekep #知识库 #mac版JDK #jdk8 #jdk1.8 #mac版jdk下载 #jdk8下载 #jdk1.8下载 #java17 #水泥涵洞隧道基建缺陷病害 #全面对比评估分析 #gcc #llvm #CLANG #编译器 #机器翻译 #时钟中断 #缺页中断 #硬件中断 #软中断 #财务 #利润表 #资产负债表 #list模拟实现 #list的使用 #C++STL容器 #npm #System V信号量 #环形队列 #BIND #信号保存 #信号集 #sigpending #软件构建 #分词搜索 #分词查询 #es可视化管理工具 #WSL #OpenGL #macOS #序列号 #机型 #查看 #对应 #macbook #Kali Linux #python安装 #Python卸载 #PyCharm激活 #gpu算力 #orb-slam3 #D435i #STL #底层 #vector #模板编程 #语法分析 #镜像源 #问题解决 #vue上传解决方案 #vue断点续传 #vue分片上传下载 #vue分块上传下载 #vue分割上传下载 #vue上传文件夹 #vue大文件上传下载 #结对编程 #uml #c++20 #APT #软件源 #二叉树基础算法 #力扣 #tcp #SMP(软件制作平台) #应用系统 #EOM(企业经营模型) #TCP #socket #智能控制 #lstm #HarmonyOS6 #智感握持 #状态模式 #nlp #CS336 #Assignment #Experiments #TinyStories #Ablation #图像创意赛 #现金奖励 #宠物爱心组织 #qemu #QEMU_EFI.fd #aarch64 #cortex-a72 #boltbot #软考 #高项 #考试 #设计规范 #放大电路 #V4L2 #Zero-Copy #DMA-BUF #DMA-FD #代理模式 #责任链模式 #Simulink #Matlab #AUTOSAR #SWC #runnable #arm64 #x64 #数字化 #敏捷流程 #快递盒检测检测系统 #海外短剧系统 #海外短剧系统开发 #海外短剧APP开发 #海外短剧系统搭建 #短剧系统 #海外短剧h5 #数据治理架构设计 #Service #systemctl #电子稳像 #MeshFlow #linux设计思想 #用户体验 #容器编排 #FTP #影刀 #RPA自动化工具 #AI结合影刀 #规格说明书 #Kalibr #log4j #Linux应急响应 #安全排查 #文件审计 #入侵检测 #服务器安全 #昇腾平台 #对比单体与微服务架构 #SpringCloud核心组件 #架构原理 #kafka #东方仙盟商业开发 #仙盟创梦IDE #东方仙盟自动化 #并集查找 #Apache IoTDB #TimechoDB #docker部署coze #coze部署详解 #docker搭建coze #docker部署Coze #coze部署 #remote-ssh #离线安装 #VSIX #内网开发 #测试工具 #红蓝对抗 #实战演练 #流计算 #数据处理 #系列课程 #ssid #VON #anaconda #WordPress #AI作画 #性能测试 #进程池 #claude code #vibe code #Autoconf #Cmake #可靠传输 #springboot #新人首发 #联机 #基础IO #MID360 # 国内加速 #libc # Ubuntu # 清华镜像 #ue4 #AIGC落地 #国家自然科学基金 #国自然 #科研 #学术 #xrandr #显示器 #显示器扩展桌面 #分屏 #Docker Desktop #gitee #webpack #索引 #分片 #FILE #es6 #工作流构建 #意图识别工作流 #namespace #cgroups #LXC #进程创建 #PLC #Modbuc_TCP #gpt-3 #文心一言 #华为od机试真题 #华为od机考真题 #华为od上机考试真题 #华为od上机考试双机位C卷 #华为od机考 #华为od机试 #历史 #链表 #Hot100 #求职面试 #RH850-U2 TRAP #RH850-U2 TRAP指令 #TRAP指令 #Armbian #DooTask #etl #etl工程师 #Flutter #Flutter教程 #移动开发教程 #safari #N8N #Mamba #动态住宅代理 #抓取 #动态规划 #exec #dockerdesktop下载 #docker windows #windows docker #dockerdesktop安装 #安装dockerdesktop #dockerdesktop使用 #docker desktop #nltosql #检索增强 #CBR #ISP调优 #watchdog #C++面经 #关键帧 #音画同步 #arbess #argocd #cocos2d #系统监控 #性能优化维监 #数据结构初阶 #时间复杂度 #空间复杂度 #线段树 #配置 #ribbon #postgis #geoserver #pbf #矢量切片 #图层组 #服务 #RTC #RAG #检索增强生成 #mybatis plus #逻辑回归 #scikit-learn #matplotlib #模拟 #YOLOv13创新改进点 #visual studio code #tailscale #显卡驱动 #Clawdbot #Moltbot #小智AI #歌曲播放 #bootstrap #windows服务 #源代码 #免费磁盘清理工具 #电脑磁盘清理工具 #清理系统垃圾 #移除冗余更新文件 #整理磁盘碎片 #深度高级电脑清理 #uv #铬锐特 #胶粘剂 #UV胶水 #光固化胶水 #紫外线胶水 #SQLite #论坛社区数据采集 #CSV采集数据导出 #腾讯云COS #MTL #市场营销 #线性代数 #智能化测试 #质量效能 #测试策略 #Chaos #论文 #投稿 #发表 #知网 #普刊 #快刊 #消息队列 #几何学 #拓扑学 #zabbix #Jetson Orin #ASUS #肝硬化 #修改rom #打开隐藏功能 #AI写作 #学习方法 #修改名称 #IPv6 #mcp #memory mcp #Cursor #IPv4 #IPv6 #计算机网络基础 #飞牛nas #fnos #SQL注入主机 #screen 命令 #电气工程 #C# #人大金仓 #Kingbase #rtsp #转发 #asp.net大文件上传 #SSH免密登录 #raid开启 # 远程运维 #SSH别名 #进程创建与终止 #本地客户端和全局服务器更新模型 #联邦学习 #服务器客户端协同工作 #参数更新 # 远程连接 #捷配 #node #junit #java-rabbitmq #sentinel #jetty #junit #java-rocketmq #java-consul # 批量部署 #ping通服务器 #读不了内网数据库 #CANN #可再生能源 #绿色算力 #风电 #服务器IO模型 #非阻塞轮询模型 #多任务并发模型 #异步信号模型 #多路复用模型 #serverless #Spring AI #AI应用编程 #GPU ##租显卡 #ONLYOFFICE #人工智能+ #rtsp服务器 #轻量级rtsp服务 #安卓rtsp服务器 #windows rtsp服务器 #linux rtsp服务器 #重装操作系统 #KMS #slmgr #lua #Karalon #AI Test #RAID #磁盘 #BIOS #AI部署 # 大模型 # ms-swift #esp32 arduino # 数字人系统 # 远程部署 #Zabbix #CosyVoice3 #语音合成 #uip #weston #x11 #x11显示服务器 #samba #KVM #mmu notifier #GPA #GVA #影子页表 # WebUI #停车场管理系统 #win10 # 端口7860 #编程助手 #dash #vncdotool #链接VNC服务器 #如何隐藏光标 #文件管理 #文件服务器 #LockBit 5.0 #勒索软件 #LovkBit # 语音合成 #AD操作技巧 #原理图库文件自动缩放 #ORM #.net #语音生成 #TTS #pytest #odoo #免密登录服务器 #解决方案 #memcache #protobuf #n8n解惑 #C++ #new #delete #malloc #free #大模型应用 #PyInstaller打包运行 #服务端部署 #身体实验室 #健康认知重构 #系统思维 #微行动 #NEAT效应 #亚健康自救 #ICT人 #硬件设计 #guava #本地缓存 #WM_LBUTTONDOWN #Logon Help对话框 #ScanSysQueue #echarts #可视化大屏 #STDIO协议 #Streamable-HTTP #McpTool注解 #服务器能力 #密码 #AutoDL #租显卡 #训练推理 #鸭科夫 #逃离鸭科夫 #鸭科夫联机 #鸭科夫异地联机 #开服 #Miniconda #超时设置 #客户端/服务器 #雨云服务器 #MCSM面板 #电源管理工具 #webrtc #腾讯云 #群晖 #音乐 #NAS #磁盘配额 #存储管理 #形考作业 #国家开放大学 #系统运维 #SMARC #MetaERP #EBS #嵌入式编译 #ccache #distcc #Linly-Talker # 数字人 # 服务器稳定性 #CNSH 中文编程 #龙魂系统 ##技术有军魂 #异步 #notify #condition #fastapi #任务调度 #层级布局标定 #IndexTTS2 # 阿里云安骑士 # 木马查杀 #minio #910B #昇腾 #Coturn #TURN #STUN #数据恢复 #视频恢复 #格式化恢复 #删除恢复 #大疆如影4D #大疆如影 #网络编程 #I/O模型 #水平触发、边缘触发 #多路复用 #AI论文写作工具 #学术写作效率提升 #AI写论文实战 #论文降重与优化 #学术写作辅助 #笔启AI论文功能 #AI写作效率提升 #跨站脚本 #cpp #log4j #.NET Core #Identity #少儿编程 #jar #后端框架 #期末作业 #Bricks #AI赋能智慧奶牛养殖 #实现传统经验到智能精准的跨越 #嵌入式端超轻量级模型 #LeYOLO #AI智慧无人养殖场景 #奶牛、幼崽智能化监管识别 #智慧养殖 #WEB #azure #三极管 #开关电路 #开关电源 #恒流源 #Multisim电路仿真 #硬件工程师 #逻辑门 #产品运营 #微PE #硬盘克隆 #DiskGenius #凤希AI伴侣 #树莓派 #net core #kestrel #web-server #asp.net-core #Tokio #异步编程 #Pin #http服务器 #cpu #指数平滑 #单片机毕业设计 #.NET8 #NS3 #ue4 #DedicatedServer #独立服务器 #专用服务器 #主图视频下载 #电商素材 #淘宝主图下载 #1688主图下载 #电商存图 #K510 #terraform #剪映 #自媒体 #自然语言处理 #鼠大侠网络验证系统源码 #攻击溯源 #适配器模式 #gateway #vllm #Python3.11 #word #NFC #智能公交 #服务器计费 #FP-增长 #系统修复 #googlecloud #C盘清理技巧分享 #C盘清理 #空间隔离 #镜像仓库 #kotlin #数据集 #数据库架构 #数据库开发 #权限 #文件权限 #unet #unet++ #cm unet #ESXi #虚拟内存管理 #程序地址空间 #LVGL图形库移植 #推荐系统 #coplar #元服务 #python3 #python语法 #ipython #Python赋值 #HarmonyOS #文件系统 #Ext2 #云开发 #云函数 #鸿蒙生态 #Socket编程之UDP #智能硬件 #仓颉 #腾讯云数据库 #TDSQL #OpenTenBase #svc #ddsp #音色克隆 #Linux应用开发 #Linux驱动开发 #FreeRTOS #STM32 #C文件库 #webpack #矩阵 #线性代数 #虚拟内存 #系统 #入门 #会计 #can #pcan #罗马十二帝王传 #苏维托尼乌斯 #Nuendo 14 #Nuendo #Nuendo14 #Nuendo13 #Nuendo12 #cubase #cubase15 #Anaconda # PaddlePaddle #macOS Sequoia #acer蓝牙键盘配对 #acer蓝牙键盘切换设备 #虚拟机 #macOS #AMD #H 255 #gpt-5 #桃夭权限框 #deb #文件 #XAF #Dev #.NET #gdb/cgdb #调试器 #Linux开发工具 #毕业答辩PPT #Windows11 #代码规范 #代码复审 #mac26 #playCover #键盘映射 #几何学 #信号量 #PV #C语言 #数据结构与算法 #StarRocks #MPP引擎 #应用层服务 #ROS #ROS环境搭建 #鱼香ROS #一键安装ROS #qtwidget #gnu #大模型应用工程师 #大模型工程师证书 #设计规范 #packet tracer下载安装 #Kernel #混合搜索 #TF-IDF VS BM25 #Rerank重排 #语义分段 #向量数据库抽象适配层 #TTFT延迟缓解 #pdf多模态处理 #职业规划 #测试包 #测试 #打包测试 #安装测试包 #紧急模式 #emergency mode #引导加载程序 #xfs #ui #arm #提示词 #gnome #milvus #proxy模式 #代理模式 #Netty #Dart #Python爬虫零基础入门 #Python爬虫实战 #数据保存与入库 #CSV/JSONL #桥接模式 #无线驱动 #FrameNode #组件动态化 #translate # Python 3.11 #IndexTTS2 #下载 #harmonyosnext #uv #文本传输 #跨平台传输 #操作系统原理 #自由表达演说平台 #年会 #发言稿 #flink #模仿学习 #isaac sim #鸿蒙大作业 #奶茶点餐 #winform #Tahoe #linux内核 #表情识别 #make #cmake #CMakeLists.txt #零代码平台 #AI开发 #自动挂载 #对象 #默认成员函数 #运算符 #华为云 #bootloard #搜索引擎 #钉钉 #openclawd #CNAS #程序文件 #学习记录 #IMX6ULL #数字IC #HarmonyOS6 #录音 #录音转文字 #镜像实战 #海外海关报关 #海关代码 #红黑树 #KALI #pywechat #OpenHarmony #Tree #c5全栈 #POC #MinerU #MinerU部署 #MinerU部署文档 #MinerU部署教程 #lxc #Vulkan #shader #nlp #一切皆文件 #spider #智能医疗 #健康档案管理 #Flink 实时计算 #HBase 存储 #糖尿病个性化管理 #医疗数据合规 #前后台进程 #大O1调度 #并发编程 #Sign #负载均衡 #网络行为分析 #进程检测 #启动项排查 #Cron审计 #隐藏进程 #个人论坛 #小皮面板 #本地服务器 #Discuz论坛 #shiro #网络基本概念 #OSI七层模型 #TCP/IP五层模型 #Thinking Claude #腾讯轻量云AI创想家 #wifi转有线 #电脑wifi 供有线设备上网 #数据订阅 #gru #ROS 2 #太极 #网络爬虫 #prompt #midjourney #stable diffusion #进程通信 #匿名管道 #wps #宏开发 #JSA宏 #自动化办公 #Excel #sqli-labs靶场 #sqli-labs #SQL注入漏洞 #SQL注入 #数据库安全 #Web安全 #5G #若依 #ruoyi #frp # 公钥私钥 # 免密登录 #AI教材生成工具 #AI写作技术 #教材创作效率提升 #教材编写问题解决 #运维工程师 #运维技术 #RunMethodList #ProcessQueueLis #新媒体运营 #用户运营 #Filter过滤器 #Interceptor拦截器 #登录 #请求拦截 #javaweb #hystrix #智能体来了 #智能制造 #供应链管理 #工业工程 #cloudflare #nul #逻辑分析仪 #隔离模块 #隔离芯片 #高压隔离 #数字 #解码器 #wireshark #PROFINET #CycleConter #DCP #LLDP #vivado #数据库运维 #复习资料 #题库 #期末考试 #DBA #selenium #智能制造 #ISA-95 #ISA-88 #数字化工厂 #笔记本电脑 #PID算法 #DIN #注意力单元 #创新点 #改进点 #兴趣表征 #激活函数 #正则化 #魔改YOLO #claude code #zerotier #内网 #公网 #穿透 #ctyunos #HMM #hmm_range_fault #hmm_range #时频传递 #QLExpress #控制流程 #从表达式到规则程序 #工程化实践解析 #高卢战记 #凯撒 #软链接 #硬链接 #xshell免费版 #Xshell下载 #xshell #xshell电脑版 #xshell 中文 #CVE-2022-49025 #Linux内核安全 #net/mlx5e #UAF漏洞 #图像翻译 #2025博客之星评选投票 #博客之星评选投票 #2025博客之星 #评选投票 #投票 #2025评选投票 #自动化脚本 #融资 #贷款 #股权融资 #债权融资 #财务管理 #企业获利 #hbase #tensorflow2 #swift # 长连接 # 心跳机制 #股票 #新闻 #BringData #亮数据 #大模型 #SpringAi #jsp大文件上传 #分类 #编码 #乱码 #jar自动逆向工具 #jar逆向源码 #Chaterm #合合信息 #Chaterm智能终端 #Windows高级文件管理器 #高级文件管理器 #Windows文件管理器 #电脑文件管理器 #多窗格文件管理器 #批量重命名工具 #Home #Home assistant #HA #playwright #云桌面 #Citrix #ESXi #deepseek #tdengine #涛思数据 #Apache Flink #实时计算 #状态管理与 #Exactly-Once语义 #计算机技术 #百度云 #百度 #百度文库 #爱企查 #旋转验证码 #验证码识别 #图像识别 #输入输出流 #simulink #智能指针实现 #长链接 #短链接 #codecapsule #羽毛球专业培训 #码上羽毛球馆 #tekton #蓝牙模块 #WIFI模块 #低功耗 #Gazebo #网络爬虫 #vue #vue3 #element plus #ant design vue #components组件 #props #vue浏览器报错 #rkmpp #HTTP #HTTP/2 #HTTP/3 #技术支持 #概率分布 #最大似然估计 #似然函数 #数理统计 #高考 #PC #自动交易 #硬件工程 #学习 #网络 #Excel函数 #VLOOKUP函数 #数据查找 #精确匹配 #近似匹配 #逆向查找 #OpenSSH升级 #微软 #OpenClaw #modelengine #GEO #结构与算法 #kotlin #mongodb #MongoDB部署 #MongoDB部署文档 #MongoDB部署方案 #docker部署MongoDB #mysql5.7 #视频编解码 #Agent #Nano Banana Pro #文生图 #多模态 #正则表达式 #hop #cnn #后台按键 #后台鼠标 #鼠标连点 #自动按键 #智慧城市 #fiddler #CSDN #MC #MC群组服务器 #Linux入门 #Shell基础 #命令行操作 #Linux发行版 #Emby #OFDMA #AutoDL使用教程 #AI大模型训练 #linux常用命令 #PaddleOCR训练 #跨域 #发布上线后跨域报错 #请求接口跨域问题解决 #跨域请求代理配置 #request浏览器跨域 #API限流 # 频率限制 # 令牌桶算法 #银河麒麟 #系统升级 #信创 #prometheus #winscp #RSO #机器人操作系统 # 双因素认证 # TensorFlow #密码学 #ebs #metaerp #oracle ebs #PyCharm # 远程调试 # YOLOFuse #openEuler #svn # 批量管理 #企业文件安全 #企业文件管理 #zookeeper #ZooKeeper #ZooKeeper面试题 #面试宝典 #深入解析 #Finalshell #生物信息学 #组学 #910B #研发管理 #禅道 #禅道云端部署 #Proxmox VE #yolov12 #研究生life # 黑屏模式 # TTS服务器 #coffeescript #Discord机器人 #云部署 #程序那些事 #python量化 #高频量化 #hft #openai炒股 #人脸识别sdk #视频编解码 #人脸识别 #sqlserver #分布式利器 #group by #row_number #over #lvs #SSH公钥认证 # 安全加固 #ONLYOFFICE #MCP 服务器 # 网络延迟 #web #webdav #chat #数字基带信号 #suno #suno api #Modbus #MOXA #Python办公自动化 #Python办公 #UDP套接字编程 #UDP协议 #网络测试 #Anything-LLM #IDC服务器 #私有化部署 #处理器 #windbg分析蓝屏教程 # 大模型部署 # 私有化AI #嵌入式开发 # DIY主机 # 交叉编译 #STUN # TURN # NAT穿透 #Socket网络编程 #工厂模式 #C++11 #jar #上市公司华证ESG #上市公司彭博ESG #上市公司wind esg #上市公司cnrds ESG #esg评级评分 #TURN # WebRTC #海光K100 #SSE # AI翻译机 # 实时翻译 #OSS #angular.js #appche #vps #移动端h5网页 #调用浏览器摄像头并拍照 #开启摄像头权限 #拍照后查看与上传服务器端 #摄像头黑屏打不开问题 #排序算法 #分治和策略 #信令服务器 #Janus #MediaSoup #视频格式转换软件 #tcpdump #防毒口罩 #防尘口罩 #DDD #绞杀者策略 #Spring Cloud #ICE #Harbor #jina #远程访问 #飞网 #安全高效 #配置简单 #sourceTree #sourceTree管理svn #es安装 #日志模块 # ControlMaster #Ward #论文降重 #降AI率 #AI降重 #快降重 #agent skills #claude #rocketmq #服务器开启 TLS v1.2 #IISCrypto 使用教程 #TLS 协议配置 #IIS 安全设置 #服务器运维工具 #个人网站 #opc #opc ua #opc模拟服务器 #PRA #408真题解析 #Comate #brpc #Robert变换 #可撤销IBE #服务器辅助 #私钥更新 #安全性证明 #双线性Diffie-Hellman #银河麒麟aarch64 #Triton #starrocks #C2000 #TI #实时控制MCU #AI服务器电源 #svn #host key #vmstat #sar #gerrit #DisM++ # GLM-4.6V # 系统维护 #google #gemini #generativeai #web服务器 #最短路算法 #Dijkstra #UDS诊断 #认证服务 #cangjie #photoshop #百万并发 #京东云 #树莓派4b安装系统 #库存超卖 #Redis #CVE-2025-68143 #CVE-2025-68144 #CVE-2025-68145 #AB包 #网路编程 #包装运输测试 #模拟运输测试 #环境试验 #包装振动测试 #包装跌落测试 #大语言模型 #分子动力学 #化工仿真 #儿童AI #图像生成 #Qwen #c++高并发 # Connection refused #RWK35xx #语音流 #实时传输 #GATT服务器 #蓝牙低功耗 #结构体 #决策树 #flume #阿里云RDS #mariadb #烟雾报警 #华中农业大学 #期末 #数电 #数字电路 #数字逻辑 #logisim #加法器 #实验报告 #游戏美术 #技术美术 #游戏策划 #rpc #wordpress #雨云 #GB28181 #SIP信令 #视频监控 #JWT #reactjs #测试覆盖率 #sublime text #sublime #删除偶数行 #删除奇数行 #数字孪生 #三维可视化 #机器人学习 #STDIO传输 #SSE传输 #WebMVC #WebFlux #用户运营 #企业信息化 #企业建站 #搭建网站 #网站管理系统系统 #建站系统 #模型训练 #最小二乘法 #yolo #vue3 #天地图 #403 Forbidden #天地图403错误 #服务器403问题 #天地图API #部署报错 #SQL #安全自动化平台 #C/C++ #docker镜像 #docker镜像源 #docker镜像加速 #docker镜像下载 #docker国内加速 #持续集成 #容器化 #进程终止 #ide #容器编排 #docker compose #Prometheus #TensorFlow # 镜像加速 # 私有镜像代理 #FuncPlotCalc #蓝耘元生代 #蓝耘MaaS #dify #工作流 #交互 #嵌入式 #环境变量 #进程切换 #进程调度 #运维开发 #无名杀 #5种IO模型 #非阻塞IO #elk #系统监控 #性能优化维监 #ctf #逆向 #向日葵 #麒麟2503 #统信UOS #国产化 #远程控制 #AutoGLM #智谱AI #OpenAutoGLM #pyenv #Navicat17 #数据库管理工具 #线程封装 #软件检测 #第三方 #ux #规则引擎 #合同 #xcode #astmd4169 #twitter #Twitter运营 #Twitter自动化 #社交媒体营销 #引流获客 #Mate XTs #鸿蒙5.1 #前后端分离 #药材购物系统 #电脑和ipad怎么传文件 #电脑和ipad传输文件 #电脑和ipad传文件 #ipad传文件 #ipad传输文件 #wap_supplicant #应用层编程 #成长纪实 #分布式软总线 #原理解析 #mac #Infuse Pro #万能播放器 #页表 #Linux权限管理 #文件权限全解析 #服务器安全配置 #用户与权限实战 #Linux系统安全 #MATLAB #R2023b #vmtools #Rocky Linux #网络配置 #利润表 #损益表 #财务 #Qt6 #二步验证 #谷歌身份验证器 #Authly #yocto #文件备份 #Syncthing #SSM 框架 #学生宿舍管理系统 #高校后勤管理 #navidia #gpu #鸿蒙应用开发 #旁路由 #OHOS-SDK #签名 #sdkman #ZeroMQ #VS2022 #RK3576 #智能家居 #ESP32 #鸿蒙跨平台应用开发 #鸿蒙跨平台应用 #支持向量机 #onedrive #SAAS #zimbra #邮件服务器 #邮件 #证书 #pem #crt #方法 #功能 #操作 #开发者平台 #pandas #博客之星 #Linux的线程池 #Java大数据 #智能教育 #在线考试 #工站流程 #业务流程组装 #产线端 #美女 #fail2ban #firewallcmd #主组 #附加组 #ClaudeCode #Claude #GLM #GLM-4.5 #智谱 #GLM-4.6 #文献综述 #V2装饰器 #V2 #装饰器 #local #gitcode #日志系统 #手搓 #刷新策略 #产品经理 #5种IO模型 #非阻塞IO #压力测试 #嵌入式软件测试 #医疗软件测试 #医疗设备嵌入式 #Parasoft #IEC 62304 #ISO14971 #Git #开发流程 #自然语言查询 # 日志分析 # Fun-ASR #KES #反向兼容 #移远通信 #AR588MA #卫星通讯 #GB28181国标部署 #接入GB28181国标平台 #wvp #rstp #vm #Macdown编辑器 #miniforge3 #移动硬盘 #boot-repair #引导修复 #studione #studioone7 #studioone6 #studio one pro #studio one 7 #studio one 6 #机架 #hyper-v #增强会话 #linux内存管理 #linux内存申请与释放 #linux内存碎片 #glibc内存管理 #深度卷积生成对抗网络 #数字信号处理 #Android16 #音频性能实战 #音频进阶 #issue #UVC #V4L2 #阴影校正 #ISP #阅读笔记 #powerbi #事务 #Cubase 15 #Cubase #Cubase15 #Cubase14 #Cubase13 #Cubase12 #nuendo14 #程序替换 #VPC #魔百盒刷机 #电视盒子 #Floor #IPIDEA #网页抓取API #蓝耘MaaS #oss #VirtualBox #Ubuntu22.04.5 #CUDA #安全自动化平台 #原子能力 #vc #omnibox #yum源 #自动化工作流 #Docker部署 #工作流平台 #DevOps #Linux 多阶段构建 #Ralph Wiggum #自动化开发 #数据链路 #数据同步 #先进数据库 #互斥锁 #原子性 #互斥量 #算逻运算 #openGauss #蓝耘agent ##影刀RPA# ##影刀RPA #触发器 #obsidian #开源协议 #分布式计算 #Java 大数据 #基因测序 #精准医疗 #Spark #mediaquery #慕课线上课程推荐 #慕课线上课程推荐可视化系统 #Pytho线上课程推荐可视化 #线上课程推荐数据分析可视化系统 #储存卷 #密码破解 #keepass #OpenStack #核心组件 #性能调优 #开源云平台 #OpenStack 企业应用 #unet #unet++ #cm unet #g++ #gdb #pip #光伏发电 #数字孪生 #光伏电站 #光伏电站运维 #碳中和 #LangGraph #AI Agent #接口测试 #即梦4.0 #opencascade #样条曲线 #xml #宝塔云服务器 #zookeeper #在线商城 #购物商城小程序 #购物小程序 #网络变压器 # 镜像加速 # 私有镜像代理 #图像识别自动化 #AirtestIDE #连接错误 #connect #ainode #Android15 #SaaS #明厨亮灶 #统信uos #中科方德 #FastCGI #PHP-FPM #缓冲区溢出 #程序断点调试 #推荐算法 #wsl子系统 #solidity #CS144 #TCP/IP 四层模型 #VPN技术 #Yocto #buildroot #ISO #Java原生目录生成 #构网 #构网控制策略 #变流器 #新能源 #构网控制 #图神经网络 #池化 #机器翻译 #动态规划 #远程软件 #运维工具 #Hexhub #AutoCAD替代 #银河麒麟操作系统 #QCAD #中望CAD #开源社区版QCAD #金蝶 #国产化技术 #AAS #SMP(软件制作平台) #uml #UML建模 #设计方案 #OBS #sshd #USB数字耳机 #192k播放 #广告 #创意广告 #网页设计 #语音合成 #ESPnet #SSRF漏洞 #SSRF实战教程 #职场和发展 #软件测试和开发 #测试场景 #用例设计 #BUG #hastcat #HNU #计算机系统 #语音 #实时音视频 #Easy-Es 实战操作详解 #Easy-Es #Easy-Es 使用 #Easy-Es 使用详解 #Easy-Es操作详解 #Easy-Es详解 #Easy-Es 实战 #neovim完全卸载 #libc库 #思源笔记 #数模 #缓存调度 #PyWin32 #CANape #COM API #GOT #自动化爬虫 #ai爬虫 #弹簧报价软件 #紫垣商驿 #卡尔曼滤波 #RTS平滑 #正向滤波 #反向平滑 #单调栈 #Prometheus #AI工具 #财报 #现金流量表 #融资杠杆系数 #资产周转率 #销售利润率 #Docker Compose #反爬虫 #海思ss928 #SVP_NNN #NNN #LED灯珠 #LED灯珠生产厂家 #指示灯珠 #家用电器 #3C数码 #LT和ET模式 #电商 #共享文件夹 #数据仓库 #doris #容器部署 #ai配音 #免费配音 #配音软件 #设备驱动 #网卡 #3d #人机系统 #人机对话 #人本 #人本智能 #学术写作 #AI论文生成 #论文查重降重 #实用工具 #DameWare #远程工具 #IT运维 #cst #CST软件 #源代码管理 #less #flowable #jeecgboot #OA #打印 #abtest #lubancat4 #西门子 #汇川 #Blazor #总线 #ERP #SAP PP # 高并发部署 #微信公众号 #入侵 #日志排查 #万悟 #联通元景 #React #Next #CVE-2025-55182 #RSC #我的世界 #挖矿 #Linux病毒 #C# # REST API # GLM-4.6V-Flash-WEB #swagger #模拟退火算法 #YOLO识别 #YOLO环境搭建Windows #YOLO环境搭建Ubuntu #jupyter #三维 #3D #三维重建 #机器视觉 #6D位姿 #Tkinter #GUI开发 # ProxyJump #jetty #SSM #在线订餐 #订餐系统 #在线订餐平台 #订餐管理系统 #Playbook #AI服务器 #工厂方法模式 #国产开源制品管理工具 #canva可画 #canvas #ModelEngine #投标 #标书制作 #IO #超算中心 #PBS #lsf #测速 #iperf #iperf3 #uvicorn #uvloop #asgi #event #VibeVoice # 云服务器 #Autodl私有云 #深度服务器配置 #JumpServer #堡垒机 #PowerBI #企业 #YOLOFuse # Base64编码 # 多模态检测 #SSH反向隧道 # Jupyter远程访问 #claudecode实战 #翻译 #开源工具 #GLM-4.6V-Flash-WEB # AI视觉 # 本地部署 # 智能运维 # 性能瓶颈分析 #最大子数组和 #Kadane算法 #分治法 #LeetCode #maxSubArray #python基础 #python小白 #面向对象 #Smokeping #json #广播 #组播 #并发服务器 #SSH保活 #uvx #uv pip #npx #Ruff #ThingsBoard MCP #着色器 #ERP 基本操作 #苍穹外卖 #KMS 激活 #分阶段策略 #模型协议 # GPU租赁 # 自建服务器 #L6 #L10 #L9 #毛利润 #营业利润 #净利润 #x32dbg #SSE #测试用例 #docker安装seata # 高温监控 # 公钥认证 #服务器架构 #AI推理芯片 #服务器线程 # SSL通信 # 动态结构体 #ipv6 #GPU服务器 #8U #anaconda3 #无网 #firefox #热敏电阻 #PTC热敏电阻 # 水冷服务器 # 风冷服务器 #IFix #rsync # 数据同步 #IO多路复用 #cocoa #ESP32编译服务器 #Ping #DNS域名解析 #WinDbg #Windows调试 #内存转储分析 #LobeChat #GPU加速 #智能一卡通 #门禁一卡通 #梯控一卡通 #电梯一卡通 #消费一卡通 #一卡通 #考勤一卡通 # 权限修复 #numpy #palantir #skywalking #告警 #分析 #链路 # 键鼠锁定 #paddleocr #智能电视 #Rendering #Multisampling #内核编码 # SSH # Qwen3Guard #pjsip #powerpoint #ueditor导入word #ueditor导入pdf #宕机 #启动失败 #操作系统 #国产化OS #mssql #RM #IMU #PID #MQTT协议 #插座检测系统 #SEW变频器 #sclgntfy #WLEventLogon #godot #clang #godot-cpp #DongYuTvWeb #电视应用 #Kotlin开发 #WebView #开源项目 #ResNet #六西格玛培训公司 #六西格玛绿带培训 #六西格玛 #精益六西格玛培训 #六西格玛培训 #ftp #sftp #Fluentd #Sonic #日志采集 #安恒明御堡垒机 #windterm #回文链表 #快慢指针 #双指针 #开发实战 # 显卡驱动备份 #Nacos #screen命令 #ARM服务器 # 多模态推理 #markdown #ComfyUI # 推理服务器 #运维工具 #OPCUA #CA证书 #视频修复 #RAID5恢复 #流媒体服务器恢复 #高斯溅射 #scala #内存治理 #展厅 #展厅升级 #创新 #计算机组成与cmd dos命令 #微信开放平台 #udp #vue上传解决方案 #AI生成 # outputs目录 # 自动化 #用户数据报协议 #hadoop #clickhouse #家政服务预约 #晶振 #虚拟线程 #JDK #I/O #ProjectLoom #Gunicorn #WSGI #Flask #并发模型 #面试题 #大模型智能体 #二进制 #openai #nfs #iscsi #起源 #发展历程 #应用领域 #汽车 #Jni #攻防演练 #Java web #红队 #ipad #复现论文 #blender #warp # 局域网访问 # 批量处理 #simulink #ipmitool #BMC #Arduino BLDC #机器人多模态智能导航系统 #ASR #SenseVoice #A2UI #CS2 #debian13 #大语言模型 #长文本处理 #GLM-4 #Triton推理 #七牛云存储 #HarmonyOS APP #Archcraft #CVE-2026-22686 #Node.js #enclave-vm沙箱 #AI代码执行领域 #超算服务器 #算力 #高性能计算 #仿真分析工作站 #边缘AI # Kontron # SMARC-sAMX8 #TensorRT # 推理优化 #C #远程软件 #Chat平台 #ARM架构 #WT-2026-0001 #QVD-2026-4572 #smartermail #主板 #总体设计 #电源树 #框图 #爬虫实战 #ai爬虫 #AutoGen #agent #AutoGenStudio #Linux开发 #系统编程 #文件IO #重定向 #微调 #训练 #多模态 #omnibox #腾讯轻量云AI创想家 #前端框架 #coze部署详解 #docker搭建coze #docker部署Coze #coze部署 #进程 #进程控制 #Lenyiin #镜像实战 #进度条 #Linux网络 #IP地址 #MAC地址 #TCP/IP协议 #网络传输流程 #Nano Banana Pro #Gemini #文生图 #Ubuntu共享文件夹 #共享目录 #Linux共享文件夹 #servlet #springboot #沙盒 #部署 #openstack #蓝耘容器云 #Shell #uboot #设备树 #基础IO #k8s集群资源管理 #云原生开发 #OpenClaw #OWASP #juice-shop #安全漏洞练习靶场 #FastCGI #PHP-FPM #telnet #远程登录 #cursor #蓝耘agent #etl #hop #自动化枚举 #WinPEAS #文件I/O #系统文件 #系统调用 #TFTP #FTP #openssh #漏洞 #sshd #散列表 #DataGrip #缓冲区 #Linux的进程概念 #Linux的线程池 #rk3588 #管道Pipe #命名管道 #用户体验 #消息队列 #SystemV #gdb/cgdb #调试器 #Linux开发工具 #进程间通信 #信号 #多线程 #pthread #线程互斥 #Windows11 #WSL2 #Makefile #RK35588 #ssh #运维 #Cgroup #线程池 #项目 #懒汉模式 #LINUX系统 #LLM #信号量 #PV #burp suite #抓包 #Yocto #buildroot #系列课程 #xrandr #显示器 #显示器扩展桌面 #分屏 #VON #Linux文件 #IO库 #Glibc #动态库 #静态库 #股票 #新闻 #BringData #材料工程 #共享内存 #System V #TimechoDB #Kubernetes #命令行解释器 #Linux系统编程 #数据库管理 #进程池 #kube-vip #coze模板 #电影解说 #AI视频剪辑工具 #coze工作流 #生产者消费者模型 #并发编程 #Ext文件系统 #Linux面试 #LBA寻址 #CHS寻址 #exec #进程替换 #英拓克 #直流调速器 #gru #PATH #make/Makefile #线程同步 #阻塞队列 #slam #navigation #GLIBC #在U盘安装操作系统 #kali linux #逻辑回归 #中文输入法 #最小系统 #burpsuite #抓包 #Homebrew #Ceiling #工业自动化 #欧姆龙 #Sysmac Studio #工控 #core #dump #usb驱动 #地学应用 #地质灾害 #布局 #列表 #网格 #轮播图 #瀑布流 #postman #Debezium系列 #基于Debezium #Operator #部署数据库 #采集任务 #西门子 #罗宾康 #A5E03407403 #WinApps #状态管理 #HmRouter #数据流 #tf-idf #easyui #短剧APP开发 #短剧平台定制开发 #短剧APP #短剧系统搭建 #夸克网盘 #夸克 #1T #volatile #顶级期刊 #IEEE TPAMI #IJCV #学术风格 #投稿策略 #轨道力学 #星际航行 #轨道确定 #航天 #防火墙 #Veristand #LabVIEW #HIL #Simulink #kibana #pass through # Shell # Bash #build-essential #学习笔记 #Linux的多线程 #android-studio #android jetpack #Studio Pro 8 #StudioPro 8 #StudioPro8 #Studio One 7 #StudioOne #Studio One 6 #Studio One 8 #Spire.Office #高速电路 #SI #PI #信号完整性 #GNSS #SPP #PPP #osg #题解 #图 #dijkstra #迪杰斯特拉 #微信开发者工具 #whisper #系统集成项目管理工程师 #Linux版PE #修改密码 #绿联 #群晖 #飞牛 #电脑上不了网怎么办 #wifi有网络但是电脑连不上网 #wifi网络设置 #wifi连接 #DNS设置 #路由器配置 #图形渲染 #密码攻击 #VLOOKUP #办公自动化 #自动匹配 #智能录入 #进销存 #数据库选型 #单元测试 #gradle #流程引擎 #Flowable #企业级组件 #项目管理 #PAN #Dify 搭建数据分析应用 #Dify 搭建数据分析平台 #Dify操作数据库 #Dify 数据可视化 #Dify 数据可视化应用 #工具集 #文件操作 #open系统调用 #HTTP跨域 #连续 查询 #CQ #真题解析 #408考研 #JSP #机房预约管理系统设计与实现 #lamp #序列化漏洞 #CISP-PTE #Bright Data #书匠策aI #vr #航空航天 #VR神舟飞船 #VR华夏神舟 #接口 #Jenkins #rpa #awk #rxjava #pat考试 #x86架构 #pyqt #罗宾康 #OpenSSH #OpenSSH下载 #OpenSSH安装 #OpenSSH使用 #OpenSSH下载教程 #OpenSSH安装教程 #OpenSSH下载安装教程 #JAVA #JavaAI #飞算 #代码生成 #飞算JavaAI炫技赛 #musictag #音乐刮削 #音乐标签 #freeswitch #技术问答 #Math #foundations #transformations #网站建设 #建站平台 #内容管理系统 #物料主数据管理系统 #花卉识别 #植物病虫害识别 #YOLO数据集 #花草识别 #dreamweaver #癌症 #HBA卡 #RAID卡 #生成对抗网络 #YOLO11 #rnn #商业应用 #AI论文写作工具 #论文效率提升 #AI写作实测 #JavaScript #资源管理 #AutoCloseable #有序释放 #健壮性 #可读性 #迁移学习 #因果推理 #统计 #光耦 #光电耦合器 #调试 #飞书 #openclaw #mcp server #AI实战 #导航网 #virtualbox #LSTM #nvcc #idc #服务器解析漏洞 #bond #服务器链路聚合 #网卡绑定 #smtp #smtp服务器 #PHP #uniapp #合法域名校验出错 #服务器域名配置不生效 #request域名配置 #已经配置好了但还是报错 #读写锁 #RCU #GIL #空间转录组与空间ATAC #空间组学联合分析 #barcode映射 #文件传输 #电脑文件传输 #电脑传输文件 #电脑怎么传输文件到另一台电脑 #电脑传输文件到另一台电脑 # 环境迁移 #Qwen3-VL # 服务状态监控 # 视觉语言模型 #java-activemq #HTML5 #audio标签 #GLM-TTS #MC # 鲲鹏 #企业级存储 #网络设备 #霍曼转移 #轨道机动 #实时语义分割 #DeepLabV3 #与BiSeNet的效率权衡 #Conda # 私有索引 # 包管理 #vivado license #puppeteer #NoSQL #音频 #RAID # GLM-TTS # 数据安全 #守护进程 #复用 #screen #学生社团管理系统 #社团加入与退出 #ARM64 # DDColor # ComfyUI #Dell #PowerEdge620 #硬盘 #RAID5 #AI 推理 #NV # 模型微调 #科学家 #Nature #音诺ai翻译机 #AI翻译机 # Ampere Altra Max #Modbus-TCP #代理服务器 #rustdesk #win11 #TTS私有化 # 音色克隆 #openresty #华为交换机 #信创终端 #teamviewer #云服务器 #个人电脑 #蓝湖 #Axure原型发布 #web前端 #guava #caffe #锐捷 #nat #银河麒麟部署 #银河麒麟部署文档 #银河麒麟linux #银河麒麟linux部署教程 #RustDesk #宝塔面板部署RustDesk #RustDesk远程控制手机 #手机远程控制 #计算机毕业设计 #计算机毕设项目 #Modbus # 串口服务器 # NPort5630 #TLS协议 #HTTPS #运维安全 # Python3.11 #浏览器 #电影院管理系统 #电影院购票系统 #电影订票系统 #代理 #Anaconda配置云虚拟环境 # keep-alive #启蒙英语 #防毒面罩 #防尘面罩 #生信入门 #生信云服务器 #功能测试 # 服务器IP访问 # 端口映射 #视觉理解 #Moondream2 #多模态AI #游戏程序 #ssm #进程调度算法 #进程同步与互斥算法 #死锁处理算法 #YOLOv11 #语义检索 #向量嵌入 #多功能电脑维护工具 #驱动更新 #游戏加速 #系统优化 #电脑驱动工具 #电脑驱动一键更新 #电脑驱动一键备份 #文生视频 #CogVideoX #AI部署 #照片背景更换 #图片换背景 #照片更换背景 #Cubase #nuendo #音乐分类 #音频分析 #ViT模型 #Gradio应用 #CMake #Make #Linux多线程 #内存结构 #CSDN成长记录 #dubbo #agentic rag #智能体 #openclaw #clawd #molt #密码攻击 #程序员 #本地化部署 #wsl #xfce #LoTDB #mfc #工业级数码管 #notepad++ #tornado #对比单体与微服务架构 #SpringCloud核心组件 #架构原理 #pcm #健康医疗 #迭代加深 #网页抓取API #数据采集 #oss #windows服务 #权限提升 #Java原生目录生成 #Claude code #自动化开发 #c5全栈 #协议定制 #JosnCpp库 #序列与反序列化 #仿真 #实战 #Skill #数据库选型 #USB共享 #共享上网 #手机热点 #safari #N8N #MCM/ICM #数学建模美赛 #运筹学 #Docker Desktop #docker windows #windows docker #dockerdesktop安装 #安装dockerdesktop #dockerdesktop使用 #docker desktop #连续 查询 #CQ #互联网医院 #idea #intellij idea #Tree #podman #国内镜像源 #wsl2 #docker 搭建mysql #mysql主从搭建 #mysql主从 #mysql主从搭建详解 #coze #Linux的多线程 #etl工程师 #防火墙阻止连接网络 #网络防火墙 #阻止软件连接网络 #网络流量控制 #局域网连接 #允许程序访问网络 #金仓数据库 #cuDNN #aarch64-linux #arm交叉编译工具 #安卓 #AI大模型 #大模型学习 #repo #openhamony #进程创建与终止 #gazebo #宇树Go2 #ROS2 #tcp #网关 #工具 #powershell #windows日志 #mmu_notifier #invalidate_seq #amdgpu svm #ainode #同花顺 #system V #trae #IDE #ELF #虚拟地址空间 #静态链接 #信号机制 #进程优先级 #Linux调度算法 #寄存器 #触发器 #linux驱动开发 #NAT #unix #epoll #高级IO #LT和ET模式 #agi #若依框架 #定制化前端动态域名 #管道 #IPC #TCP协议 #医学图像分割 #CNN #Transformer #人工智能论文 #平板电脑 #nodejs #强化学习 #时钟中断 #写时拷贝 #缺页中断 #硬件中断 #软中断 #Trae #AI代码编辑器 #文件系统 #Ext2 #ai编程 #Typore #线程封装 #国产数据库 #KingbaseES部署工具 #华为OD机试真题 #华为OD机考 #华为OD上机考试 #华为OD机试双机位C卷 #华为OD机考双机位C卷 #显卡驱动 #firecrawl #mobaxterm #termius #electerm #tabby #termcc #EtherCAT #MinerU #MinerU部署 #MinerU部署文档 #MinerU部署教程 #经管科研 #struts #xml #安全性测试 #Docker Hub #HTTP跨域 #跨域 #电视剧收视率分析与可视化平台 #体系建设 #可控 #云安全 #wifi有网络但是电脑连不上网 #wifi网络设置 #wifi连接 #DNS设置 #网卡驱动 #路由器配置 ##影刀RPA# ##影刀RPA #就业 #ai大模型 #华为od机考真题 #华为od机试真题 #华为OD上机考试真题 #华为OD上机考试双机位C卷 #华为ODFLASH坏块监测系统 #CISP #CISP考试 #公众号:厦门微思网络 #+微信:xmweisi #找达人 #koc #达人广场 #达人分销 #小青苔达人营销 #reactjs #宠物 #MySQL #缓存一致性 #延迟双删 #架构设计 #分布式缓存 #Effective C++ #iperf3 #关系型 #perf #使用教程 #tidb #TiDB测试集群 #Jetson Orin #安装 #大模型教程 #lxc #cgroups #Linux的基础开发工具 #eNSP #企业网络规划 #华为eNSP #网络规划 #esp32 #jtag # Mac部署 # Docker #学术 #专著 #降重 #降AI #毕业论文 #运维必备 #投屏软件 #Escrcpy #安卓投屏 #办公学习 #openeuler #bridge #Wan2.2-T2V-5B # Mac M系列芯片 # 文本生成视频 #Vue3 #前端工具链 #Vite #Pinia #AI集成 #rancher #orbstack #库存管理 #原型模式 #网络层 #IP协议 #教材创作效率提升 #教材格式规范处理 #AI教材写作工具 #教育行业技术应用 #教材创作项目实战 #教材格式问题解决 #Codes #Jira #需求管理对比 #项目经理 #sas # 模型训练 #Web墨卡托投影 #失真规律 #等角圆柱投影 #QGIS #PaleMoon #Firefox # AI部署 #scala #MCP服务器注解 #异步支持 #方法筛选 #声明式编程 #自动筛选机制 #risc-v #pcb工艺 #MacOS #电路仿真 #proteus #AD #keil #硬件工程师面试 #Xshell #Ubuntu22.04 #Cmake #AI零代码开发 #敏捷开发 #自然语言编程 #软件开发范式变革 #蓝牙 #YOLOv12 #影刀 #RPA自动化工具 #AI结合影刀 #自动化工作流 #Docker部署 #工作流平台 #硬件架构 #最小系统 #css3 #udev #jdk #JDK17 #jdk21 #TraeAgent #局域网共享无权限 #组策略局域网访问修复 #绿色便携版网络工具 #多系统共享兼容性处理 #原子能力 #知识库 #Qwen3 #GEO #密码破解原理 #John the Ripper #POC #基础指令 #汇编 #脚本语言 #vibe code #vertx #vertx4 #vert.x #runOnContext #worker #ultralytics #各个子模块代码学习解读 #图像分割 #目标跟踪 #DETR #remote-ssh #离线安装 #VSIX #内网开发 #Java面试题 #面试宝典 #深入解析 #思源笔记 #捷配 #AINode #Reactor #ET模式 #非阻塞 #高并发服务器 #NativeRAG #docker run #数据卷挂载 #端口映射 #交互模式 #MySQL 8.0容器化 #MySQL远程访问配置 #Docker数据卷挂载 #visual studio code #python学习路线 #python基础 #python进阶 #python标准库 #需求分析 #SSH 服务 #SSH Server #OpenSSH Server #GPT #Deepseek #osg #tensorflow #WordPress #期货 #umeditor粘贴word #ueditor粘贴word #ueditor复制word #ueditor上传word图片 #ueditor导入word #vue断点续传 #vue分片上传下载 #vue分块上传下载 #vue分割上传下载 #vue上传文件夹 #YOLOv13 #Thinking Claude #grafana #监控 #redis-cluster #gossip协议 #缓存集群 #命令模式 #linux设计思想 #docker搭建pg #docker搭建pgsql #pg授权 #postgresql使用 #postgresql搭建 #udp #测试工具 #word2vec #zTasker #发展心理学 #运动控制 #内在动机 #镜像神经元 #交叉学科 #技能大赛 #神州数码 #AD9518 #密码破解 #keepass #Linux的基础IO #KingbaseES #先进数据库 #91n #gpt-oss-20b #模型下载 #互斥锁 #原子性 #互斥量 #算逻运算 #sketch #命令行 #基础入门 #编程 #ssid #软件供应链安全 #软件成分分析 #软件物料清单 #SCA #投毒情报 #技术问答 #检索 #虚拟地址 #车载系统 #xmind #pygame #virtualenv #plotly #GPUGEEK #软链接 #硬链接 #Isaac Sim #IsaacSimAssets #Ubuntu 24.04 #宏开发 #JSA宏 #自动化办公 #Excel #mojo #驱动安装 #英伟达驱动 #nvidia驱动安装 #持续部署 #线程安全 #重入问题 #死锁 #饿汉模式 #Fast_livo2 #checksum #rpm #yum #网络基本概念 #OSI七层模型 #TCP/IP五层模型 #信号保存 #信号集 #sigpending #数据链路 #数据同步 #日志系统 #手搓 #刷新策略 #中间件 #大模型推理调优 #SGLang #利用率优化 #vllm-ascend #Atlas 800T A2 #NPU #miniconda #Miniconda教程 #硬件 #exec系列 #进程程序替换 #文件操作 #open系统调用 #文件描述符 #FILE #namespace #LXC #虚拟化 #Portainer #远程 #进程等待 #wait #waitpid #omv8 #树莓派 #日志 #池化技术 #System V信号量 #环形队列 #QGC安装 #ROS 2 #指令 #Make #OpenJDK #OpenJDK部署 #docker部署OpenJDK #OpenJDK部署文档 #OpenJDK部署教程 #PAN #企业微信 #obsidian #lb #协议 #comfyui #提示词 #cocos2d #智慧照明 #合同系统智能化 #企业合同管理 #传统合同管理痛点 #合同系统智能化优势 #合同系统智能化搭建方法 #合同系统智能化实用技巧 #合同系统智能化关键考量 #项目实践 #.NET开发 #C#编程 #编程与数学 #改行学it #第一个fastAPI项目 #fastAPI #中级 #GOT #main函数参数 #命令行参数 #codex #gpt-5 #转行 #期现匹配 #套期保值 #风险管理 #计算机 #前后台进程 #进程地址空间 #多模态代理 #AI原生应用 #攻防演练 #watchtower #大模型入门 #旗云智联 #旗云智家 #物联网云平台 #全屋智能 #智慧家居 #Kali #RAG调优 #RAG系统 #召回 #p2p #安装教程 #模板和元编程 #GCC #crosstool-ng #ROS环境搭建 #鱼香ROS #一键安装ROS #实验室 #异步IO #io_uring #动静态库 #镜像源 #知识 #类 #asp.net大文件上传下载 #asp.net大文件上传源码 #ASP.NET断点续传 #asp.net上传文件夹 #asp.net上传大文件 #.net core断点续传 #宝塔云服务器 #Docker Compose #大模型训练 #RAGFlow #Ioc #空间计算 #etcd #cfssl #循环结构 #Java处理POI分类数据 #ApachePOI数据处理 #高德POI分类数据存储 #POI数据分类存储 #时间序列预测 #Informer #TFT #注意力机制 #网络攻击模型 #电科金仓 #搜狗输入法 #智能合约 #polkadot #Socket编程之UDP #hbase #clawdbot #moltbot #Tailscale #实用工具 #DameWare #远程工具 #IT运维 #kickstart #流程自动化 #智能运营 #数字化转型 #效率提升 #wsl子系统 #Ubuntu安装 #Oracle #harmonyOS APP #harmony PC #软件测试 #AI测试 #自动化测试 #SFTP #FTP工具 #服务器文件传输 #KingBaseES #composer #静脉曲张 #腿部健康 #线程 #资源划分 #单轴放大器 #Qt6 #JS逆向 #ruby #Dify部署 #Docker配置 #Git安装 #YOLO26 #core #dump #持续交付 #多路转接 #扩容 #根目录 #双系统 #android jetpack #mapreduce #moontv #oriontv #livox #原型模式 #进程通信 #匿名管道 #家庭影院 #网络存储 #局域网 #n8n工作流 #n8n教程 #n8n本地部署 #n8n自动化工作流 #n8n使用教程 #n8n工作流实战案例 #笔记本电脑 #facebook #长链接 #短链接 #数列 #数学 #数论 #洛谷 #红蓝对抗 #实战演练 #frp #设计师 #ux #创业管理 #数据驱动决策 #经营分析 #现金流管理 #经营仪表盘 #Excel实战 #创业工具 #磁盘清理 #聚类 #腾讯云数据库 #TDSQL #OpenTenBase #graphql #快捷键 #DenseNet #MinIO #存储工具 #Claude #Hooks #实用技巧 #ppt