最新资讯

  • c++仿muduo库实现高并发服务器--connection类

c++仿muduo库实现高并发服务器--connection类

2026-01-29 19:57:07 栏目:最新资讯 4 阅读

前置声明与枚举定义

class Connection;
// DISCONNECTED 连接关闭状态
// CONNECTING 连接建立成功-待处理状态
// CONNECTED 连接建立完成,各种设置完成,可通信状态
// DISCONNECTING 待关闭状态
typedef enum
{
    DISCONNECTED,
    CONNECTING,
    CONNECTED,
    DISCONNECTING
} ConnStatu;
using PtrConnection = std::shared_ptr<Connection>;

lass Connection; 这是一个类的前置声明,它允许我们在Connection类完整定义之前,使用指向Connection类的指针或引用。比如在定义PtrConnection类型别名时就用到了这个前置声明。

typedef enum {… } ConnStatu; 定义了一个枚举类型ConnStatu,用于清晰地表示连接可能处于的不同状态。DISCONNECTED代表连接关闭状态,CONNECTING表示连接建立成功但还处于待处理状态,CONNECTED意味着连接建立完成,各项设置就绪,可以进行通信,DISCONNECTING则是连接即将关闭的待关闭状态。

using PtrConnection = std::shared_ptr; 创建了一个类型别名PtrConnection,它实际上就是std::shared_ptr,使用这个别名可以方便地管理Connection对象的共享所有权,在后续代码中传递和操作Connection对象时更加简洁。

Connection类定义

class Connection : public std::enable_shared_from_this<Connection>
{
    //...
};

class Connection : public std::enable_shared_from_this 表示Connection类继承自std::enable_shared_from_this。通过这种继承,Connection类可以安全地从自身获取std::shared_ptr管理对象。这在回调函数等场景中非常重要,因为它确保了对象在被共享使用时,其生命周期能够被正确管理,避免了悬空指针等问题。

私有成员函数 - HandleRead

void HandleRead() // 描述符触发可读事件后调用的函数,接收socked数据放到接收缓冲区中,然后调用message_callback
{
    // 1 接收socket数据放到缓冲区
    char buf[65536];
    ssize_t ret = _socket.NoneBlockRecv(buf, 65535);
    if (ret < 0)
    {
        // 出错了,不能直接关闭连接
        return ShutdownInLoop();
    }

    else if (ret == 0) // 这里等于0表示没有读取到数据,并非连接断开,断开是返回-1
    {
        return;
    }
    // 将数据放入输入缓冲区,写入之后顺便将写偏移向后移动
    _in_buffer.WriteAndPush(buf, ret);
    // 2 调用message_callback进行业务处理
    if (_in_buffer.ReadAbleSize() > 0)
    {
        // shared_from_this()从当前对象自身获取自身的shared_ptr管理对象
        return _message_callback(shared_from_this(), &_in_buffer);
    }
}

当描述符触发可读事件时,HandleRead函数会被调用。它的主要职责是从套接字接收数据并放入接收缓冲区,之后调用message_callback来处理业务逻辑。

首先,创建一个大小为65536的字符数组buf,用于接收数据。然后使用_socket.NoneBlockRecv函数从套接字接收数据,该函数尝试接收最多65535字节的数据,并返回实际接收的字节数ret。

如果ret < 0,表示接收数据出错,此时调用ShutdownInLoop函数进行关闭连接的相关处理,但不直接关闭连接,因为可能还有其他后续操作需要处理。

如果ret == 0,说明这次没有读取到数据,但并不意味着连接断开(连接断开通常返回 -1),直接返回,等待下一次事件触发。

若成功读取到数据(ret > 0),将数据写入_in_buffer输入缓冲区,并根据读取的字节数移动写偏移。接着,检查_in_buffer中是否有可读数据,如果有,则通过_message_callback调用业务处理函数,并使用shared_from_this()获取当前对象的std::shared_ptr,将其和_in_buffer的指针传递给回调函数。

私有成员函数 - HandleWrite

void HandleWrite() // 描述符触发可写事件后调用的函数,将发送缓冲区数据进行发送
{
    //_out_buffer中保存的数据就是要发送的数据
    ssize_t ret = _socket.NoneBlockSend(_out_buffer.ReadPosition(), _out_buffer.ReadAbleSize());
    if (ret < 0)
    {
        // 发送错误就该关闭连接,
        if (_in_buffer.ReadAbleSize() > 0)
        {
            _message_callback(shared_from_this(), &_in_buffer);
        }
        return Release(); // 实际的关闭释放操作
    }
    _out_buffer.MoveReadOffset(ret); // 将读偏移向后移动
    if (_out_buffer.ReadAbleSize() == 0)
    {
        _channel.DisableWrite(); // 没有数据发送了,关闭写事件监控
        // 如果当前是连接关闭状态,有数据则发完数据再释放连接,否则直接释放
        if (_statu == DISCONNECTING && _out_buffer.ReadAbleSize() == 0)
        {
            return Release();
        }
    }
    return;
}

当描述符触发可写事件时,HandleWrite函数会被调用,其任务是将发送缓冲区_out_buffer中的数据发送出去。

调用_socket.NoneBlockSend函数尝试发送数据,该函数从_out_buffer的当前读位置开始,发送可读大小的数据,并返回实际发送的字节数ret。

如果ret < 0,表示发送数据出错,此时检查_in_buffer中是否有可读数据,如果有,则调用_message_callback处理这些数据,然后调用Release函数进行连接的关闭和资源释放操作。

如果发送成功(ret >= 0),根据发送的字节数移动_out_buffer的读偏移,以标记已发送的数据。若_out_buffer中没有剩余可读数据(即所有数据都已发送),调用_channel.DisableWrite()关闭写事件监控,避免不必要的事件触发。此外,如果当前连接状态为DISCONNECTING且_out_buffer已无数据,说明所有数据已发送完毕,也调用Release函数释放连接。

私有成员函数 - HandleClose

void HandleClose() // 描述符触发挂断事件
{
    /*一旦连接挂断了,套接字就什么都干不了了,因此有数据待处理就处理一下,完毕关闭连接*/
    if (_in_buffer.ReadAbleSize() > 0)
    {
        _message_callback(shared_from_this(), &_in_buffer);
    }
    return Release();
}

当描述符触发挂断事件时,HandleClose函数被调用。因为连接挂断后,套接字基本无法再进行正常操作,所以先检查_in_buffer中是否有待处理的数据。

如果_in_buffer中有可读数据,调用_message_callback处理这些数据,确保数据在连接关闭前得到适当处理。处理完数据后,调用Release函数释放连接相关的资源,关闭连接。

私有成员函数 - HandleError

void HandleError() // 描述符触发出错事件
{
    return HandleClose();
}

当描述符触发出错事件时,HandleError函数被调用。它直接调用HandleClose函数,这意味着在出错情况下,将按照连接挂断的处理方式来处理,即先处理可能存在的未处理数据,然后释放连接资源。

私有成员函数 - HandleEvent

void HandleEvent() // 描述符触发任意事件:1 刷新连接的活跃度--延迟定时销毁任务 2 调用组件使用者的任意事件回调
{
    if (_enable_inactive_release == true)
    {
        _loop->TimerRefresh(_conn_id);
    }
    if (_event_callback)
    {
        _event_callback(shared_from_this());
    }
}

当描述符触发任意事件时,HandleEvent函数被调用。它有两个主要功能:一是刷新连接的活跃度(如果启用了非活跃销毁功能),二是调用组件使用者设置的任意事件回调函数。

如果_enable_inactive_release为true,表示启用了非活跃连接超时释放功能,此时调用_loop->TimerRefresh(_conn_id)来刷新定时器,延迟连接的定时销毁任务,即延长连接在非活跃状态下的存活时间。

如果_event_callback存在(即组件使用者设置了该回调函数),调用_event_callback(shared_from_this()),将当前连接对象的std::shared_ptr传递给回调函数,以便使用者在回调中进行相应的处理。

私有成员函数 - EstablishedInLoop

void EstablishedInLoop() // 连接获取之后所处的状态下要进行各种设置(启动读监控,调用回调函数)
{
    // 1 修改连接状态
    assert(_statu == CONNECTING); // 当前状态必须是上层的半连接状态
    _statu = CONNECTED; // 当前函数执行完毕,则连接进入已完成连接状态
    // 一旦启动读事件监控有可能会立即触发读事件,如果
    // 2 启动读事件监控
    _channel.EnableRead();

    // 3 调用回调函数
    if (_connected_callback)
        _connected_callback(shared_from_this());
}

EstablishedInLoop函数用于在连接获取后进行一系列必要的设置。

首先,通过assert(_statu == CONNECTING)断言当前连接状态必须为CONNECTING,以确保连接处于正确的阶段。然后将连接状态修改为CONNECTED,表示连接已成功建立并完成各项设置,可以进行通信。

接着,调用_channel.EnableRead()启动读事件监控,使连接能够接收数据。由于启动读事件监控后可能会立即触发读事件,所以这一步需要谨慎处理。

最后,如果_connected_callback回调函数已被设置(即组件使用者提供了该回调),调用_connected_callback(shared_from_this()),通知使用者连接已成功建立,同时将当前连接对象的std::shared_ptr传递给回调函数,以便使用者进行后续操作。

私有成员函数 - ReleaseInLoop

void ReleaseInLoop() // 实际的释放接口
{
    // 1 修改连接状态,将其置为DISCONNECTED
    _statu = DISCONNECTED;
    // 2 移除连接的事件监控
    _channel.Remove();
    // 3 关闭文件描述符
    _socket.Close();
    // 4 如果当前定时器队列中还有定时销毁任务,则取消任务
    if (_loop->HasTimer(_conn_id))
        CancelInactiveReleaseInLoop();
    // 5 调用关闭回调函数,避免先移除服务器管理的连接信息导致Connection被释放,所以要先调用用户的回调函数
    if (_closed_callback)
        _closed_callback(shared_from_this());
    // 移除服务器内部管理的连接信息
    if (_server_closed_callback)
        _closed_callback(shared_from_this());
}

ReleaseInLoop函数是连接释放的实际操作接口。

首先,将连接状态设置为DISCONNECTED,表明连接已关闭。

然后,调用_channel.Remove()移除连接的事件监控,不再监听该连接的任何事件。

接着,调用_socket.Close()关闭与连接关联的文件描述符,释放相关资源。

如果当前定时器队列中存在针对该连接的定时销毁任务(通过_loop->HasTimer(_conn_id)判断),调用CancelInactiveReleaseInLoop()取消该任务,避免在连接已手动关闭的情况下,定时任务再次尝试关闭连接导致错误。

之后,先调用_closed_callback(如果已设置),这是用户定义的连接关闭回调函数,确保用户有机会在连接关闭时进行自定义操作。然后调用_server_closed_callback(如果已设置),用于移除服务器内部管理的连接相关信息。这样的顺序可以避免在移除服务器管理信息后,由于Connection对象被释放而导致回调函数无法正确执行的问题。

私有成员函数 - SendInLoop

// 这个接口并非实际的发送接口,而是将数据放到发送缓冲区,启动可写事件监控
void SendInLoop(Buffer &buf)
{
    if (_statu == DISCONNECTED)
        return;
    _out_buffer.WriteBufferAndPush(buf);
    if (_channel.WriteAble() == false)
    {
        _channel.EnableWrite();
    }
}

SendInLoop函数并非直接进行数据发送,而是将数据放入发送缓冲区,并在必要时启动可写事件监控。

首先检查连接状态,如果连接状态为DISCONNECTED,说明连接已关闭,直接返回,不进行任何操作。

否则,调用_out_buffer.WriteBufferAndPush(buf)将传入的缓冲区buf中的数据写入_out_buffer发送缓冲区。

接着检查_channel的写事件是否已启用(通过_channel.WriteAble()判断),如果未启用,则调用_channel.EnableWrite()启用写事件监控,以便在套接字可写时触发HandleWrite函数,将发送缓冲区中的数据发送出去。

私有成员函数 - ShutdownInLoop

// 这个关闭操作并非实际的连接释放操作,需要判断还有没有数据待处理,待发送
void ShutdownInLoop()
{
    _statu = DISCONNECTING; // 设置连接为半关闭状态
    if (_in_buffer.ReadAbleSize() > 0)
    {
        if (_message_callback)
            _message_callback(shared_from_this(), &_in_buffer);
    }
    // 要么就是写入数据的时候出错关闭,要么是没有待发送数据,直接关闭
    if (_out_buffer.ReadAbleSize() > 0)
    {
        if (_channel.WriteAble() == false)
        {
            _channel.EnableWrite();
        }
    }
    if (_out_buffer.ReadAbleSize() == 0)
    {
        Release();
    }
}

ShutdownInLoop函数用于执行连接关闭的预处理操作,但并非实际释放连接,它需要检查是否还有数据待处理或待发送。

首先将连接状态设置为DISCONNECTING,表示连接进入半关闭状态。

然后检查_in_buffer中是否有可读数据,如果有且_message_callback已设置,调用_message_callback(shared_from_this(), &_in_buffer)处理这些数据,确保数据在连接关闭前得到处理。

接着检查_out_buffer中是否有待发送的数据,如果有且_channel的写事件未启用,调用_channel.EnableWrite()启用写事件监控,以便将数据发送出去。

如果_out_buffer中没有待发送数据(即_out_buffer.ReadAbleSize() == 0),说明所有数据已处理完毕或无需发送,调用Release()函数实际释放连接资源。

私有成员函数 - EnableInactiveReleaseInLoop

// 启动非活跃连接超时释放规则
void EnableInactiveReleaseInLoop(int sec)
{
    // 1 将判断标志 _enable_inactive_release置为true
    _enable_inactive_release = true;
    // 2 如果当时定时销毁任务已经存在,那就刷新延迟
    if (_loop->HasTimer(_conn_id))
    {
        return _loop->TimerRefresh(_conn_id);
    }
    // 3 如果不存在定时销毁任务,则新增
    _loop->TimerAdd(_conn_id, sec, std::bind(&Connection::Release, this));
}

EnableInactiveReleaseInLoop函数用于启动非活跃连接超时释放规则。

首先,将_enable_inactive_release标志设置为true,表示启用非活跃连接超时释放功能。

然后检查定时器队列中是否已经存在针对该连接的定时销毁任务(通过_loop->HasTimer(_conn_id)判断)。如果存在,调用_loop->TimerRefresh(_conn_id)刷新定时器的延迟时间,延长连接在非活跃状态下的存活时间。

如果不存在定时销毁任务,则使用_loop->TimerAdd(_conn_id, sec, std::bind(&Connection::Release, this))添加一个新的定时任务。该任务将在指定的sec秒后触发,触发时会调用Connection::Release函数,从而实现非活跃连接的超时释放。

私有成员函数 - CancelInactiveReleaseInLoop

void CancelInactiveReleaseInLoop()
{
    _enable_inactive_release = false;
    _loop->TimerCancel(_conn_id);
    if (_loop->HasTimer(_conn_id))
    {
        _loop->TimerCancel(_conn_id);
    }
}

CancelInactiveReleaseInLoop函数的主要目的是取消Connection对象的非活跃连接超时释放机制。这意味着原本设置的如果连接在一定时间内未活动就自动释放连接的规则将被取消。

先标记该连接不再需要非活跃超时检查

再向事件循环请求取消与该连接ID关联的定时器,双重检查确保定时器真正被移除

私有成员函数 - UpgradeInLoop

void UpgradeInLoop(const Any &context,
                   const ConnectedCallback &conn,
                   const MessageCallback &msg,
                   const ClosedCallback &closed,
                   const AnyEventCallback &event)
{
    _context = context;
    _connected_callback = conn;
    _message_callback = msg;
    _closed_callback = closed;
    _event_callback = event;
}

UpgradeInLoop函数用于切换协议时重置上下文以及阶段性回调处理函数。

它接受五个参数,分别是上下文context、连接回调conn、消息回调msg、关闭回调closed和任意事件回调event。

函数内部将传入的参数分别赋值给对应的成员变量_context、_connected_callback、_message_callback、_closed_callback和_event_callback。这样在协议切换后,新的上下文和回调函数就会生效,确保连接能按照新的协议规则进行处理。

公共成员函数 - 构造函数

Connection(EventLoop *loop, uint64_t conn_id, int sockfd) : _conn_id(conn_id), _sockfd(sockfd),
                                                          _enable_inactive_release(false), _loop(loop), _statu(CONNECTING), _socket(_sockfd),
                                                          _channel(loop, _sockfd)
{
    _channel.SetCloseCallback(std::bind(&Connection::HandleClose, this));
    _channel.SetEventCallback(std::bind(&Connection::HandleEvent, this));
    _channel.SetReadCallback(std::bind(&Connection::HandleRead, this));
    _channel.SetWriteCallback(std::bind(&Connection::HandleWrite, this));
    _channel.SetErrorCallback(std::bind(&Connection::HandleError, this));
}

构造函数用于初始化Connection对象的成员变量,并设置_channel的各种事件回调函数。

它接受三个参数:EventLoop指针loop,用于关联事件循环;连接唯一 ID conn_id;文件描述符sockfd。

通过成员初始化列表,对_conn_id、_sockfd、_enable_inactive_release(初始化为false)、_loop、_statu(初始化为CONNECTING)、_socket(使用sockfd初始化)和_channel(使用loop和sockfd初始化)进行初始化。

然后使用std::bind将Connection类的各个事件处理函数(HandleClose、HandleEvent、HandleRead、HandleWrite、HandleError)绑定到_channel的相应回调设置函数中。这样,当_channel监测到对应的事件时,就会调用相应的处理函数。

公共成员函数 - 析构函数

~Connection()
{
    DBG_LOG("RELEASE CONNECTION:%p", this);
}

析构函数在Connection对象销毁时被调用。

这里通过DBG_LOG输出日志信息,表明该Connection对象正在被释放,日志中包含对象的地址this,方便调试时追踪对象的销毁情况。

公共成员函数 - Fd

// 获取管理的文件描述符
int Fd()
{
    return _sockfd;
}

Fd函数用于获取与Connection对象关联的文件描述符。

它直接返回成员变量_sockfd的值,外部代码可以通过调用这个函数获取文件描述符,以便在需要时对底层套接字进行操作,如设置套接字选项等。

公共成员函数 - Id

// 获取连接ID
int Id()
{
    return _conn_id;
}

Id函数用于获取Connection对象的唯一标识符。

它直接返回成员变量_conn_id的值,这个 ID 可以用于在服务器中标识和管理不同的连接,例如在连接管理模块中查找特定的连接。

公共成员函数 - Connected

// 是否处于CONNECTED状态
bool Connected()
{
    return (_statu == CONNECTED);
}

Connected函数用于判断Connection对象当前是否处于CONNECTED状态。

它通过比较成员变量_statu与枚举值CONNECTED来确定连接状态,返回true表示连接处于已建立且可通信状态,返回false则表示处于其他状态。

公共成员函数 - SetContext

// 设置上下文--连接建立完成时进行设置调用
void SetContext(const Any &context)
{
    _context = context;
}

SetContext函数用于设置连接的上下文。

在连接建立完成后调用,接受一个Any类型的参数context,并将其赋值给成员变量_context。上下文可以用于存储与连接相关的额外信息,不同的业务逻辑可以根据这个上下文进行不同的处理。

公共成员函数 - GetContext

// 获取上下文,返回指针
Any *GetContext()
{
    return &_context;
}

GetContext函数用于获取连接的上下文指针。

它返回成员变量_context的地址,外部代码可以通过这个指针访问和修改连接的上下文信息。

公共成员函数 - SetConnectedCallback

void SetConnectedCallback(const ConnectedCallback &cb)
{
    _connected_callback = cb;
}

SetConnectedCallback函数用于设置连接建立成功的回调函数。

接受一个ConnectedCallback类型的参数cb,并将其赋值给成员变量_connected_callback。当连接成功建立并进入CONNECTED状态时,会调用这个回调函数通知使用者。

公共成员函数 - SetMessageCallback

void SetMessageCallback(const MessageCallback &cb)
{
    _message_callback = cb;
}

SetMessageCallback函数用于设置消息处理的回调函数。

接受一个MessageCallback类型的参数cb,并将其赋值给成员变量_message_callback。当从套接字接收到数据并放入接收缓冲区后,如果缓冲区有可读数据,就会调用这个回调函数进行业务处理。

公共成员函数 - SetClosedCallback

void SetClosedCallback(const ClosedCallback &cb)
{
    _closed_callback = cb;
}

SetClosedCallback函数用于设置连接关闭的回调函数。

接受一个ClosedCallback类型的参数cb,并将其赋值给成员变量_closed_callback。当连接关闭时,会调用这个回调函数,使用者可以在回调中进行清理资源、记录日志等操作。

公共成员函数 - SetAnyEventCallback

void SetAnyEventCallback(const AnyEventCallback &cb)
{
    _event_callback = cb;
}

SetAnyEventCallback函数用于设置任意事件的回调函数。

接受一个AnyEventCallback类型的参数cb,并将其赋值给成员变量_event_callback。当描述符触发任意事件时,会调用这个回调函数,使用者可以在回调中对各种事件进行统一处理。

公共成员函数 - SetSrvClosedCallback

void SetSrvClosedCallback(const AnyEventCallback &cb)
{
    _server_closed_callback = cb;
}

SetSrvClosedCallback函数用于设置服务器内部管理连接关闭时的回调函数。

接受一个AnyEventCallback类型的参数cb,并将其赋值给成员变量_server_closed_callback。当服务器内部需要移除该连接的管理信息时,会调用这个回调函数,以便在服务器层面进行连接关闭的相关处理。

公共成员函数 - Established

// 连接建立就绪后,进行channel回调设置,启动读监控,调用_connected_callback
void Established()
{
    _loop->RunInLoop(std::bind(&Connection::EstablishedInLoop, this));
}

Established函数用于在连接建立就绪后执行一系列操作。

它通过_loop->RunInLoop将EstablishedInLoop函数放入事件循环中执行。这样做是为了确保这些操作在事件循环的线程上下文中执行,以避免多线程环境下可能出现的竞态条件等问题。EstablishedInLoop函数会进行连接状态修改、启动读事件监控以及调用连接成功回调函数等操作。

公共成员函数 - Send

// 发送数据,将数据发送到缓冲区,启动事件监控																																  
void Send(const char *data, size_t len)
{
    // 外界传入的data,有可能是个临时的空间,我们现在只是把操作压入了任务池,有可能并没有被立即执行
    // 因此有可能执行的时候,data指向的空间已经被释放了
    Buffer buf;
    buf.WriteAndPush(data, len);
    _loop->RunInLoop(std::bind(&Connection::SendInLoop, this, std::move(buf)));
}

Send函数用于发送数据。

由于外界传入的data指针可能指向一个临时空间,而当前只是将发送操作压入任务池,不一定立即执行,为避免执行时data指向的空间已被释放,先创建一个Buffer对象buf,并将data中的数据写入buf。

然后通过_loop->RunInLoop将SendInLoop函数放入事件循环中执行,并将buf以std::move的方式传递,这样可以避免不必要的拷贝,提高效率。SendInLoop函数会将数据放入发送缓冲区,并在必要时启动可写事件监控。

公共成员函数 - Shutdown

// 提供给组件使用者的关闭接口--并不实际关闭,需要判断有没有数据处理																														  
void Shutdown()
{
    _loop->RunInLoop(std::bind(&Connection::ShutdownInLoop, this));
}

Shutdown函数是提供给组件使用者的关闭连接接口。

它通过_loop->RunInLoop将ShutdownInLoop函数放入事件循环中执行。ShutdownInLoop函数会进行连接关闭的预处理操作,如设置连接为半关闭状态,检查并处理接收和发送缓冲区中的数据,在合适的时机调用Release函数实际释放连接资源。这种方式确保了关闭操作在事件循环的线程上下文中进行,避免多线程问题。

公共成员函数 - Release

void Release()
{
    _loop->QueueInLoop(std::bind(&Connection::ReleaseInLoop, this));
}

Release函数用于发起连接释放操作。

它通过_loop->QueueInLoop将ReleaseInLoop函数放入事件循环队列中。ReleaseInLoop函数会实际执行连接释放的操作,包括修改连接状态、移除事件监控、关闭文件描述符、取消定时销毁任务以及调用关闭回调函数等。将其放入事件循环队列可以确保这些操作在合适的时机执行,避免在不合适的线程或时间点进行资源释放导致的错误。

公共成员函数 - EnableInactiveRelease

// 启动非活跃连接销毁,并定义多长时间无通信就是非活跃,添加定时任务																																		  
void EnableInactiveRelease(int sec)
{
    _loop->RunInLoop(std::bind(&Connection::EnableInactiveReleaseInLoop, this, sec));
} 

EnableInactiveRelease函数用于启动非活跃连接销毁机制,并定义非活跃的时间。

它接受一个参数sec,表示非活跃的时间(秒数)。通过_loop->RunInLoop将EnableInactiveReleaseInLoop函数放入事件循环中执行,并将sec传递给EnableInactiveReleaseInLoop函数。EnableInactiveReleaseInLoop函数会设置非活跃销毁标志,检查并刷新或添加定时任务,在指定的非活跃时间后触发连接释放操作。

公共成员函数 - CancelInactiveRelease

void CancelInactiveRelease()
{
    _loop->RunInLoop(std::bind(&Connection::CancelInactiveReleaseInLoop, this));
}

CancelInactiveRelease函数用于取消非活跃连接销毁机制。

通过_loop->RunInLoop将CancelInactiveReleaseInLoop函数放入事件循环中执行。CancelInactiveReleaseInLoop函数会禁用非活跃销毁标志,并取消定时器队列中针对该连接的定时销毁任务,确保连接不会因为非活跃而被释放。

公共成员函数 - Upgrade

// 切换协议--重置上下文以及阶段性回调处理函数--这个接口必须在EventLoop中立即执行
// 防备新的事件触发后,处理时切换任务还没有执行--会导致数据使用原协议处理																													  
void Upgrade(const Any &context,
             const ConnectedCallback &conn,
             const MessageCallback &msg,
             const ClosedCallback &closed,
             const AnyEventCallback &event)
{
    _loop->AssertInLoop();
    _loop->RunInLoop(std::bind(&Connection::UpgradeInLoop, this, context, conn, msg, closed, event));
}

Upgrade函数用于切换协议,重置上下文以及阶段性回调处理函数。

它接受五个参数,分别是上下文context、连接回调conn、消息回调msg、关闭回调closed和任意事件回调event。

首先调用_loop->AssertInLoop()确保当前线程是事件循环线程,防止在错误的线程中调用该函数导致未定义行为。然后通过_loop->RunInLoop将UpgradeInLoop函数放入事件循环中执行,并将上述五个参数传递给UpgradeInLoop函数。这样做是为了确保在切换协议时,新的上下文和回调函数能够及时生效,避免在切换过程中因新事件触发而使用原协议处理数据的问题。

本文地址:https://www.yitenyun.com/2387.html

搜索文章

Tags

#ios面试 #ios弱网 #断点续传 #ios开发 #objective-c #ios #ios缓存 #服务器 #python #pip #conda #远程工作 #人工智能 #微信 #kubernetes #笔记 #平面 #容器 #linux #学习方法 香港站群服务器 多IP服务器 香港站群 站群服务器 #Trae #IDE #AI 原生集成开发环境 #Trae AI #运维 #分阶段策略 #模型协议 #学习 #银河麒麟高级服务器操作系统安装 #银河麒麟高级服务器V11配置 #设置基础软件仓库时出错 #银河麒高级服务器系统的实操教程 #生产级部署银河麒麟服务系统教程 #Linux系统的快速上手教程 #华为云 #部署上线 #动静分离 #Nginx #新人首发 #docker #github #git #科技 #深度学习 #自然语言处理 #神经网络 #物联网 #websocket #harmonyos #鸿蒙PC #hadoop #hbase #hive #zookeeper #spark #kafka #flink #gemini #gemini国内访问 #gemini api #gemini中转搭建 #Cloudflare #进程控制 #开源 #fastapi #html #css #大数据 #职场和发展 #程序员创富 #Conda # 私有索引 # 包管理 #ARM服务器 # GLM-4.6V # 多模态推理 #unity #c# #游戏引擎 #低代码 #爬虫 #音视频 #ci/cd #jenkins #gitlab #ssh #kylin #tcp/ip #网络 #qt #C++ #langchain #数据库 #儿童书籍 #儿童诗歌 #童话故事 #经典好书 #儿童文学 #好书推荐 #经典文学作品 #开发语言 #云原生 #iventoy #VmWare #OpenEuler #经验分享 #安卓 #数信院生信服务器 #Rstudio #生信入门 #生信云服务器 #diskinfo # TensorFlow # 磁盘健康 #内网穿透 #cpolar #RTP over RTSP #RTP over TCP #RTSP服务器 #RTP #TCP发送RTP #后端 #MobaXterm #ubuntu #node.js #word #umeditor粘贴word #ueditor粘贴word #ueditor复制word #ueditor上传word图片 #vscode #mobaxterm #计算机视觉 #aws #云计算 #ide #区块链 #测试用例 #生活 #sql #AIGC #agi #arm #分布式 #华为 #自动化 #ansible #语言模型 #大模型 #ai #ai大模型 #agent #android #腾讯云 #flutter #Reactor #前端 #nginx #serverless #java-ee #文心一言 #AI智能体 #Harbor #FTP服务器 #http #项目 #高并发 #PyCharm # 远程调试 # YOLOFuse #缓存 #pytorch #Dell #PowerEdge620 #内存 #硬盘 #RAID5 #windows #企业开发 #ERP #项目实践 #.NET开发 #C#编程 #编程与数学 #飞牛nas #fnos #flask #PyTorch #模型训练 #星图GPU #AI编程 #java #jar #程序人生 #科研 #博士 #jmeter #功能测试 #软件测试 #自动化测试 #mysql #多个客户端访问 #IO多路复用 #回显服务器 #TCP相关API #鸿蒙 #mcu #centos #svn #javascript #vue上传解决方案 #vue断点续传 #vue分片上传下载 #vue分块上传下载 #pycharm #网络协议 #c++ #uni-app #小程序 #notepad++ #信息与通信 #安全 #算法 #内存治理 #django #iBMC #UltraISO #散列表 #哈希算法 #数据结构 #leetcode #数学建模 #2026年美赛C题代码 #2026年美赛 #架构 #spring boot #php #蓝桥杯 #个人开发 #课程设计 #rocketmq #golang #redis #游戏 #vue.js #mvp #设计模式 #京东云 #性能优化 #DeepSeek #服务器繁忙 #AI #牛客周赛 #dify #计算机网络 #spring cloud #spring #json #jvm #mmap #nio #web安全 #prometheus #ecmascript #elementui #jetty #开源软件 #鸭科夫 #逃离鸭科夫 #鸭科夫联机 #鸭科夫异地联机 #开服 #Ansible # 自动化部署 # VibeThinker #Ubuntu服务器 #硬盘扩容 #命令行操作 #VMware #web #webdav #阻塞队列 #生产者消费者模型 #服务器崩坏原因 #我的世界 #数据仓库 #vllm #Streamlit #Qwen #本地部署 #AI聊天机器人 #矩阵 #线性代数 #AI运算 #向量 #LLM #vim #gcc #yum #智能手机 #语音识别 #everything #rabbitmq #protobuf #es安装 #单片机 #stm32 #嵌入式硬件 #设备驱动 #芯片资料 #网卡 #需求分析 #scala #测试工具 #压力测试 #全能视频处理软件 #视频裁剪工具 #视频合并工具 #视频压缩工具 #视频字幕提取 #视频处理工具 #udp #adb #阿里云 #ModelEngine #gpu算力 #DisM++ # 系统维护 #风控模型 #决策盲区 #网络安全 #fabric #postgresql #AI论文写作工具 #学术论文创作 #论文效率提升 #MBA论文写作 #信息可视化 #claude code #codex #code cli #ccusage #数据集 #企业微信 #Ascend #MindIE #Android #Bluedroid #java大文件上传 #java大文件秒传 #java大文件上传下载 #java文件传输解决方案 #ffmpeg #svm #amdgpu #kfd #ROCm #journalctl #openresty #lua #wordpress #雨云 #LobeChat #vLLM #GPU加速 #里氏替换原则 #幼儿园 #园长 #幼教 #守护进程 #复用 #screen #chatgpt #DS随心转 #n8n #SSH反向隧道 # Miniconda # Jupyter远程访问 #c语言 #sizeof和strlen区别 #sizeof #strlen #计算数据类型字节数 #计算字符串长度 #正则 #正则表达式 #智能路由器 #iphone #AI写作 #凤希AI伴侣 #epoll #高级IO #流量监控 #架构师 #系统架构 #软考 #系统架构师 #面试 #大模型学习 #MC #LoRA # RTX 3090 # lora-scripts #react.js #fiddler #链表 #链表的销毁 #链表的排序 #链表倒置 #判断链表是否有环 #ddos #microsoft #opencv #数据挖掘 #googlecloud #机器学习 #电脑 #grafana #todesk #银河麒麟 #系统升级 #信创 #国产化 #asp.net大文件上传 #asp.net大文件上传下载 #asp.net大文件上传源码 #ASP.NET断点续传 #asp.net上传文件夹 #arm开发 #Modbus-TCP #编辑器 #金融 #mcp #金融投资Agent #Agent #ping通服务器 #读不了内网数据库 #bug菌问答团队 #流程图 #论文阅读 #论文笔记 #毕业设计 #MCP #MCP服务器 #中间件 #debian #研发管理 #禅道 #禅道云端部署 #VS Code调试配置 #深度优先 #DFS #asp.net #RAID #RAID技术 #磁盘 #存储 #1024程序员节 #unity3d #服务器框架 #Fantasy #elasticsearch #transformer #pencil #pencil.dev #设计 #密码学 #求职招聘 #sqlite #时序数据库 #Triton # PyTorch # CUDA #版本控制 #Git入门 #开发工具 #代码托管 #selenium #RAG #全链路优化 #实战教程 #个人博客 #海外服务器安装宝塔面板 #测试流程 #金融项目实战 #P2P #数模美赛 #matlab #制造 #SSH保活 #Miniconda #远程开发 #nas #openlayers #bmap #tile #server #vue #openEuler #Hadoop #TCP #客户端 #嵌入式 #DIY机器人工房 #嵌入式编译 #ccache #distcc #mcp server #AI实战 #SSH Agent Forwarding # 容器化 #nacos #银河麒麟aarch64 #uvicorn #uvloop #asgi #event #.net #大模型入门 #AI大模型 #homelab #Lattepanda #Jellyfin #Plex #Emby #Kodi #TensorRT # Triton # 推理优化 #zabbix #信令服务器 #Janus #MediaSoup #ssl #迁移重构 #数据安全 #漏洞 #代码迁移 #Jetty # CosyVoice3 # 嵌入式服务器 #YOLO #建筑缺陷 #红外 #oracle #模版 #函数 #类 #笔试 #树莓派4b安装系统 #esp32教程 #SA-PEKS # 关键词猜测攻击 # 盲签名 # 限速机制 #WEB #sqlserver #我的世界服务器搭建 #minecraft #apache #laravel #shell #CPU利用率 #risc-v #simulink #ms-swift # 一锤定音 # 大模型微调 #deepseek #Playbook #AI服务器 #SSH公钥认证 # 安全加固 #数组 #流媒体 #NAS #飞牛NAS #监控 #NVR #EasyNVR #cpp #几何学 #拓扑学 #PowerBI #企业 #AB包 #负载均衡 #ESXi #Linux #线程 #线程池 #Qwen3-14B # 大模型部署 # 私有化AI #Shiro #反序列化漏洞 #CVE-2016-4437 #vuejs #vp9 #运营 #eBPF #screen 命令 #macos #搜索引擎 #驱动开发 #支付 #产品经理 #ui #团队开发 #墨刀 #figma #酒店客房管理系统 #毕设 #论文 #fpga开发 #LVDS #高速ADC #DDR #智慧校园解决方案 #智慧校园一体化平台 #智慧校园选型 #智慧校园采购 #智慧校园软件 #智慧校园专项资金 #智慧校园定制开发 #webrtc #wsl #azure #ceph #HeyGem # 远程访问 # 服务器IP配置 #边缘计算 #MS #Materials #ssm #目标检测 #若依 #quartz #框架 #蓝耘智算 #SMTP # 内容安全 # Qwen3Guard #数码相机 #ida #SSH #X11转发 #C语言 #改行学it #创业创新 #Coze工作流 #AI Agent指挥官 #多智能体系统 #autosar #ONLYOFFICE #MCP 服务器 #tomcat #STUN # TURN # NAT穿透 #前端框架 #tdengine #涛思数据 #claude #推荐算法 #cursor #tensorflow #进程 #操作系统 #进程创建与终止 #log #ollama #llm #visual studio code #RustDesk #IndexTTS 2.0 #本地化部署 #信号处理 #tcpdump #embedding #银河麒麟操作系统 #openssh #华为交换机 #信创终端 #目标跟踪 #车辆排放 #智能一卡通 #门禁一卡通 #梯控一卡通 #电梯一卡通 #消费一卡通 #一卡通 #考勤一卡通 #远程桌面 #远程控制 #Spring AI #STDIO协议 #Streamable-HTTP #McpTool注解 #服务器能力 #bash #paddleocr #生信 #raid #raid阵列 #jupyter #Socket网络编程 # 目标检测 #pdf #edge #迭代器模式 #观察者模式 #Anything-LLM #IDC服务器 #私有化部署 #大模型教程 #SRS #直播 #mybatis #milvus #springboot #知识库 #p2p #电气工程 #C# #PLC #YOLOFuse # 水冷服务器 # 风冷服务器 #web server #请求处理流程 #UDP套接字编程 #UDP协议 #网络测试 #intellij-idea #database #idea #rdp #chrome #能源 #翻译 #开源工具 #Host #渗透测试 #SSRF #libosinfo #音乐分类 #音频分析 #ViT模型 #Gradio应用 #鼠大侠网络验证系统源码 #单元测试 #whisper #ComfyUI # 推理服务器 #政务 #游戏私服 #云服务器 #分类 #模拟退火算法 #powerbi #虚拟机 #Clawdbot #个人助理 #数字员工 #状态模式 #maven #微信小程序 #LabVIEW知识 #LabVIEW程序 #LabVIEW功能 #labview #windows11 #系统修复 #yolov12 #研究生life #文件传输 #电脑文件传输 #电脑传输文件 #电脑怎么传输文件到另一台电脑 #电脑传输文件到另一台电脑 #性能 #优化 #RAM #mongodb #IPv6 #DNS # REST API # GLM-4.6V-Flash-WEB #其他 #源码 #闲置物品交易系统 #流量运营 #用户运营 #neo4j #NoSQL #SQL #restful #ajax #视频去字幕 #flume #RXT4090显卡 #RTX4090 #深度学习服务器 #硬件选型 #万悟 #联通元景 #智能体 #镜像 #UDP #prompt #idm #YOLOv8 # Docker镜像 #计算机 #OPCUA #健身房预约系统 #健身房管理系统 #健身管理系统 #pandas #matplotlib #mamba #双指针 #gateway #Comate #OSS #firefox #CMake #Make #C/C++ #Python #rust #clickhouse #代理 #北京百思可瑞教育 #百思可瑞教育 #北京百思教育 #程序员 #算力一体机 #ai算力服务器 #硬件工程 #scrapy #青少年编程 # 高并发部署 #eclipse #servlet #arm64 #vps #自动驾驶 #CANN #wpf #串口服务器 #Modbus #MOXA #机器视觉 #6D位姿 #UOS #海光K100 #统信 #tornado #webpack #硬件 #Fun-ASR # 语音识别 # WebUI #学术写作辅助 #论文创作效率提升 #AI写论文实测 #https #CUDA #JAVA #Java #Canal #部署 #昇腾300I DUO #reactjs #web3 #Dify #ARM架构 #鲲鹏 #vnstat #c++20 #产品运营 #1panel #vmware #AutoDL #联机教程 #局域网联机 #局域网联机教程 #局域网游戏 #运维开发 #集成测试 #微服务 #重构 #opc ua #opc #东方仙盟 # GLM-TTS # 数据安全 #API限流 # 频率限制 # 令牌桶算法 #5G #汇编 #select #黑群晖 #无U盘 #纯小白 #指针 #说话人验证 #声纹识别 #CAM++ #anaconda #虚拟环境 #SSH跳板机 # Python3.11 #PTP_1588 #gPTP #Gunicorn #WSGI #Flask #并发模型 #容器化 #性能调优 #蓝湖 #Axure原型发布 #LangGraph #模型上下文协议 #MultiServerMCPC #load_mcp_tools #load_mcp_prompt #机器人 #ip #typescript #npm #gitea #turn #ai编程 #微PE # GLM # 服务连通性 #llama #Windows #数据分析 #ambari #muduo库 #uv #uvx #uv pip #npx #Ruff #pytest #结构体 #TCP服务器 #开发实战 #数据恢复 #视频恢复 #视频修复 #RAID5恢复 #流媒体服务器恢复 #网站 #截图工具 #批量处理图片 #图片格式转换 #图片裁剪 #Windows 更新 #910B #昇腾 #Android16 #音频性能实战 #音频进阶 #结构与算法 #框架搭建 #RSO #机器人操作系统 #平板 #零售 #交通物流 #智能硬件 #glibc #扩展屏应用开发 #android runtime #CTF #Anaconda配置云虚拟环境 #MQTT协议 #TLS协议 #HTTPS #漏洞修复 #运维安全 #SSE # AI翻译机 # 实时翻译 #vivado license #钉钉 #html5 # IndexTTS 2.0 # 远程运维 #可信计算技术 #无人机 #Deepoc #具身模型 #开发板 #未来 #winscp #openHiTLS #TLCP #DTLCP #商用密码算法 #r-tree #聊天小程序 #集成学习 #NFC #智能公交 #服务器计费 #FP-增长 # 双因素认证 #Proxmox VE #虚拟化 #rustdesk #连接数据库报错 #Docker #交互 #GPU服务器 #8U #硬件架构 #NPU #intellij idea #cnn # Base64编码 # 多模态检测 #ipmitool #BMC #C #浏览器自动化 #python #cosmic #bootstrap #SPA #单页应用 #web3.py #系统安全 #IndexTTS2 # 阿里云安骑士 # 木马查杀 #SSH免密登录 #H5 #跨域 #发布上线后跨域报错 #请求接口跨域问题解决 #跨域请求代理配置 #request浏览器跨域 #麒麟OS #swagger #游戏机 #JumpServer #堡垒机 #UDP的API使用 #处理器 #上下文工程 #langgraph #意图识别 #mariadb #ESP32 #传感器 #MicroPython #策略模式 #RK3576 #瑞芯微 #硬件设计 #振镜 #振镜焊接 #teamviewer #CLI #JavaScript #langgraph.json #数据采集 #浏览器指纹 #大模型应用 #API调用 #PyInstaller打包运行 #服务端部署 #elk #大语言模型 #Nacos #gRPC #注册中心 #Rust #Tokio #异步编程 #系统编程 #Pin #http服务器 #win11 #chat #twitter #CosyVoice3 # IP配置 # 0.0.0.0 #iot #智能家居 #zotero #WebDAV #同步失败 #代理模式 #工具集 #智慧城市 #Langchain-Chatchat # 国产化服务器 # 信创 #galeweather.cn #高精度天气预报数据 #光伏功率预测 #风电功率预测 #高精度气象 #线性回归 #c #YOLO26 #muduo #TcpServer #accept #高并发服务器 #欧拉 #儿童AI #图像生成 #勒索病毒 #勒索软件 #加密算法 #.bixi勒索病毒 #数据加密 #pjsip #超算服务器 #算力 #高性能计算 #仿真分析工作站 #LangFlow # 轻量化镜像 # 边缘计算 #麒麟 #实时音视频 #业界资讯 # 自动化运维 #贴图 #材质 #设计师 #游戏美术 #ICPC #postman #VoxCPM-1.5-TTS # 云端GPU # PyCharm宕机 #JT/T808 #车联网 #车载终端 #模拟器 #仿真器 #开发测试 #copilot #硬盘克隆 #DiskGenius #CFD #媒体 #论文复现 #AI生成 # outputs目录 # 自动化 #知识 #WinSCP 下载安装教程 #SFTP #FTP工具 #服务器文件传输 #excel #手机h5网页浏览器 #安卓app #苹果ios APP #手机电脑开启摄像头并排查 #语音生成 #TTS #n8n解惑 #IO #hibernate #大模型开发 #esp32 arduino #ArkUI #ArkTS #鸿蒙开发 #HistoryServer #Spark #YARN #jobhistory #ZooKeeper #ZooKeeper面试题 #面试宝典 #深入解析 #大模型部署 #mindie #大模型推理 #AI技术 #内存接口 # 澜起科技 # 服务器主板 # 显卡驱动备份 #go #简单数论 #埃氏筛法 #AITechLab #cpp-python #CUDA版本 #连锁药店 #连锁店 #广播 #组播 #并发服务器 #puppeteer #x86_64 #数字人系统 #KMS #slmgr #宝塔面板部署RustDesk #RustDesk远程控制手机 #手机远程控制 #ARM64 # DDColor # ComfyUI #Ubuntu #ESP32编译服务器 #Ping #DNS域名解析 #eureka #rtsp #转发 #Fluentd #Sonic #日志采集 #POC #问答 #交付 #面向对象 #xlwings #Excel #企业存储 #RustFS #对象存储 #高可用 #三维 #3D #三维重建 # keep-alive #Chat平台 #IntelliJ IDEA #Spring Boot #前端开发 #Llama-Factory # 大模型推理 #自由表达演说平台 #演说 #nfs #iscsi #log4j #clamav #CVE-2025-61686 #路径遍历高危漏洞 #范式 #Karalon #AI Test # 代理转发 # 跳板机 #命令模式 #echarts #文件管理 #文件服务器 #国产开源制品管理工具 #Hadess #一文上手 # 服务器IP # 端口7860 #聚类 #web服务器 #环境搭建 #scanf #printf #getchar #putchar #cin #cout #图像处理 #yolo # 公钥认证 #ET模式 #非阻塞 # GPU租赁 # 自建服务器 #VibeVoice # 语音合成 # 云服务器 #遛狗 #ipv6 #duckdb #MinIO服务器启动与配置详解 #多模态 #微调 #超参 #LLamafactory #高品质会员管理系统 #收银系统 #同城配送 #最好用的电商系统 #最好用的系统 #推荐的前十系统 #JAVA PHP 小程序 #cesium #可视化 #SSH复用 # 远程开发 #导航网 # 硬件配置 #磁盘配额 #存储管理 #形考作业 #国家开放大学 #系统运维 #自动化运维 #DHCP #C++ UA Server #SDK #跨平台开发 #排序算法 #jdk #排序 #Linux多线程 #注入漏洞 #nvidia #CSDN #aiohttp #asyncio #异步 #GATT服务器 #蓝牙低功耗 #软件 #本地生活 #电商系统 #商城 #SMP(软件制作平台) #EOM(企业经营模型) #应用系统 # ControlMaster # 模型微调 #safari #项目申报系统 #项目申报管理 #项目申报 #企业项目申报 #.netcore #Aluminium #Google #memory mcp #Cursor #Go并发 #高并发架构 #Goroutine #系统设计 #Tracker 服务器 #响应最快 #torrent 下载 #2026年 #Aria2 可用 #迅雷可用 #BT工具通用 #net core #kestrel #web-server #asp.net-core # 远程连接 #Zabbix #语音合成 #FASTMCP #Buck #NVIDIA #交错并联 #DGX #攻防演练 #Java web #红队 #贪心算法 #EMC存储 #存储维护 #NetApp存储 #vue3 #人脸识别 #人脸核身 #活体检测 #身份认证与人脸对比 #微信公众号 #TTS私有化 # IndexTTS # 音色克隆 #GB28181 #SIP信令 #SpringBoot #视频监控 #WT-2026-0001 #QVD-2026-4572 #smartermail #土地承包延包 #领码SPARK #aPaaS+iPaaS #数字化转型 #智能审核 #档案数字化 #农产品物流管理 #物流管理系统 #农产品物流系统 #农产品物流 #系统管理 #服务 #xss #编程 #c++高并发 #百万并发 #Termux #Samba #SSH别名 #screen命令 #asp.net上传大文件 #源代码管理 #黑客技术 #网安应急响应 #ShaderGraph #图形 #管道Pipe #system V #uip #VMware Workstation16 #服务器操作系统 #openclaw #考研 #信创国产化 #达梦数据库 #进程等待 #wait #waitpid # 高并发 #全文检索 #2026AI元年 #年度趋势 #国产PLM #瑞华丽PLM #瑞华丽 #PLM #GPU ##租显卡 #SAP #ebs #metaerp #oracle ebs #AI-native #dba #技术美术 #游戏策划 #游戏程序 #用户体验 #国产化OS #SSH跳转 #可撤销IBE #服务器辅助 #私钥更新 #安全性证明 #双线性Diffie-Hellman #区间dp #二进制枚举 #图论 #L2C #勒让德到切比雪夫 # GPU集群 #多线程 #性能调优策略 #双锁实现细节 #动态分配节点内存 #markdown #建站 # 批量管理 #ASR #SenseVoice #H5网页 #网页白屏 #H5页面空白 #资源加载问题 #打包部署后网页打不开 #HBuilderX #A2A #GenAI #CVE-2025-68143 #CVE-2025-68144 #CVE-2025-68145 #VMWare Tool #abtest #ue5 #weston #x11 #x11显示服务器 #计算几何 #斜率 #方向归一化 #叉积 #samba #天地图 #403 Forbidden #天地图403错误 #服务器403问题 #天地图API #部署报错 #插件 #插入排序 #心理健康服务平台 #心理健康系统 #心理服务平台 #心理健康小程序 # 数字人系统 # 远程部署 #软件工程 #文生视频 #CogVideoX #AI部署 #DAG #JNI #CPU # ProxyJump #服务器解析漏洞 #测评 #CCE #Dify-LLM #Flexus #dubbo #TFTP #NSP #下一状态预测 #aigc #kmeans #数字孪生 #三维可视化 #海外短剧 #海外短剧app开发 #海外短剧系统开发 #短剧APP #短剧APP开发 #短剧系统开发 #海外短剧项目 #随机森林 #经济学 #网路编程 #Discord机器人 #云部署 #程序那些事 #WinDbg #Windows调试 #内存转储分析 #spine #TRO #TRO侵权 #TRO和解 #运维工具 #计组 #数电 # 黑屏模式 # TTS服务器 #Node.js #漏洞检测 #CVE-2025-27210 #逻辑回归 #领域驱动 #移动端h5网页 #调用浏览器摄像头并拍照 #开启摄像头权限 #拍照后查看与上传服务器端 #摄像头黑屏打不开问题 #cascadeur #服务器IO模型 #非阻塞轮询模型 #多任务并发模型 #异步信号模型 #多路复用模型 #memcache #大剑师 #nodejs面试题 #C2000 #TI #实时控制MCU #AI服务器电源 # 树莓派 # ARM架构 #OBC #文件IO #输入输出流 #Xshell #Finalshell #生物信息学 #组学 #ranger #MySQL8.0 #统信UOS #win10 #qemu # 大模型 # 模型训练 #Smokeping #3d # Connection refused #长文本理解 #glm-4 #推理部署 #pve #智能体来了 #智能体对传统行业冲击 #行业转型 #AI赋能 #企业级存储 #网络设备 #ngrok #视觉检测 #visual studio #跳槽 #工作 #sql注入 #机器人学习 #HarmonyOS #雨云服务器 #Minecraft服务器 #教程 #MCSM面板 #Apple AI #Apple 人工智能 #FoundationModel #Summarize #SwiftUI # 服务器配置 # GPU #appche #视觉理解 #Moondream2 #多模态AI #numpy #路由器 #CA证书 #CS336 #Assignment #Experiments #TinyStories #Ablation #Syslog #系统日志 #日志分析 #日志监控 #Autodl私有云 #深度服务器配置 # 批量部署 #星际航行 # 键鼠锁定 #agentic bi #人脸识别sdk #视频编解码 #opc模拟服务器 #远程连接 #lvs #stl #IIS Crypto #工程设计 #预混 #扩散 #燃烧知识 #层流 #湍流 #量子计算 #Keycloak #Quarkus #AI编程需求分析 #编程助手 #AI赋能盾构隧道巡检 #开启基建安全新篇章 #以注意力为核心 #YOLOv12 #AI隧道盾构场景 #盾构管壁缺陷病害异常检测预警 #隧道病害缺陷检测 #ARMv8 #内存模型 #内存屏障 #服务器线程 # SSL通信 # 动态结构体 #RWK35xx #语音流 #实时传输 #node #娱乐 #敏捷流程 #报表制作 #职场 #数据可视化 #用数据讲故事 #参数估计 #矩估计 #概率论 #canvas层级太高 #canvas遮挡问题 #盖住其他元素 #苹果ios手机 #安卓手机 #调整画布层级 #学术生涯规划 #CCF目录 #基金申请 #职称评定 #论文发表 #科研评价 #顶会顶刊 #蓝牙 #LE Audio #BAP #计算机毕业设计 #程序定制 #毕设代做 #课设 # child_process #节日 #麦克风权限 #访问麦克风并录制音频 #麦克风录制音频后在线播放 #用户拒绝访问麦克风权限怎么办 #uniapp 安卓 苹果ios #将音频保存本地或上传服务器 #YOLO11 #仙盟创梦IDE #GLM-4.6V-Flash-WEB # AI视觉 # 本地部署 #基础语法 #标识符 #常量与变量 #数据类型 #运算符与表达式 #地理 #遥感 #动态规划 #taro #AI应用编程 #dlms #dlms协议 #逻辑设备 #逻辑设置间权限 #scikit-learn #gpu #nvcc #cuda #安全威胁分析 #群晖 #音乐 #主板 #总体设计 #电源树 #框图 #Minecraft #PaperMC #我的世界服务器 #SQL注入主机 #EN4FE #Coturn #TURN #Archcraft #Claude #Linly-Talker # 数字人 # 服务器稳定性 #模块 #kong #Kong Audio #Kong Audio3 #KongAudio3 #空音3 #空音 #中国民乐 #零代码平台 #AI开发 #SMARC #ARM #传统行业 #小艺 #搜索 #glances #戴尔服务器 #戴尔730 #装系统 #电子电气架构 #系统工程与系统架构的内涵 #汽车 #Routine #junit #ThingsBoard MCP #gnu # 智能运维 # 性能瓶颈分析 #空间计算 #原型模式 #devops #数据访问 # 服务器IP访问 # 端口映射 #工程实践 #就业 #bug #百度 #ueditor导入word #图像识别 #国产操作系统 #V11 #kylinos #KMS激活 #gpt #API #wps #Java程序员 #Java面试 #后端开发 #Spring源码 #Spring #mssql #寄存器 #composer #symfony #java-zookeeper #lucene #poll #coffeescript #b树 #实体经济 #商业模式 #软件开发 #数智红包 #商业变革 #创业干货 #语义搜索 #嵌入模型 #Qwen3 #AI推理 #FaceFusion # Token调度 # 显存优化 #AI产品经理 #挖漏洞 #攻击溯源 #windbg分析蓝屏教程 #blender #warp #个性化推荐 #BERT模型 #le audio #低功耗音频 #通信 #连接 #tcp/ip #网络 #RPA #影刀RPA #AI办公 #Prometheus #因果学习 #高斯溅射 #React安全 #漏洞分析 #Next.js #安全架构 #Puppet # IndexTTS2 # TTS #交换机 #三层交换机 #AI智能棋盘 #Rock Pi S #高仿永硕E盘的个人网盘系统源码 #MC群组服务器 #云开发 #个人电脑 #漏洞挖掘 #视频 #unix #webgl #支持向量机 #CS2 #debian13 #BoringSSL # ARM服务器 #VPS #搭建 #递归 #线性dp #门禁 #梯控 #智能梯控 #超时设置 #客户端/服务器 #网络编程 #挖矿 #Linux病毒 # 鲲鹏 #http头信息 #VSCode # SSH #k8s #音诺ai翻译机 #AI翻译机 # Ampere Altra Max #sklearn # 权限修复 #ICE #文本生成 #CPU推理 #树莓派 #温湿度监控 #WhatsApp通知 #IoT #MySQL # HiChatBox # 离线AI #人形机器人 #人机交互 #华为od #华为机试 #react native #文件上传漏洞 #xml #Kylin-Server #服务器安装 #Gateway #认证服务器集成详解 #短剧 #短剧小程序 #短剧系统 #微剧 #Kuikly #openharmony #服务器开启 TLS v1.2 #IISCrypto 使用教程 #TLS 协议配置 #IIS 安全设置 #服务器运维工具 #nosql #uniapp #合法域名校验出错 #服务器域名配置不生效 #request域名配置 #已经配置好了但还是报错 #uniapp微信小程序 #vncdotool #链接VNC服务器 #如何隐藏光标 #mtgsig #美团医药 #美团医药mtgsig #美团医药mtgsig1.2 #HBA卡 #RAID卡 #DDD #tdd #大学生 #大作业 #电梯 #电梯运力 #电梯门禁 #bond #服务器链路聚合 #网卡绑定 #CNAS #CMA #程序文件 #证书 # GPU服务器 # tmux #程序开发 #程序设计 #后端框架 #wireshark #网络安全大赛 #FHSS #题解 #图 #dijkstra #迪杰斯特拉 #outlook #错误代码2603 #无网络连接 #2603 #算力建设 #MCP服务器注解 #异步支持 #方法筛选 #声明式编程 #自动筛选机制 #性能测试 #LoadRunner #智能制造 #供应链管理 #工业工程 #库存管理 #nodejs #云服务器选购 #Saas #具身智能 #RK3588 #RK3588J #评估板 #核心板 #嵌入式开发 #SSH密钥 #sentinel #练习 #基础练习 #循环 #九九乘法表 #计算机实现 # Qwen3Guard-Gen-8B #dynadot #域名 #ETL管道 #向量存储 #数据预处理 #DocumentReader #工厂模式 #esb接口 #走处理类报异常 #N8N #网络攻击模型 #pyqt #smtp #smtp服务器 #PHP #r语言 #银河麒麟部署 #银河麒麟部署文档 #银河麒麟linux #银河麒麟linux部署教程 #声源定位 #MUSIC #resnet50 #分类识别训练 #PyTorch 特性 #动态计算图 #张量(Tensor) #自动求导Autograd #GPU 加速 #生态系统与社区支持 #与其他框架的对比 #STDIO传输 #SSE传输 #WebMVC #WebFlux #OpenManage #AI视频创作系统 #AI视频创作 #AI创作系统 #AI视频生成 #AI工具 #AI创作工具 #fs7TF #AI+ #coze #AI入门 #npu #隐私合规 #网络安全保险 #法律风险 #风险管理 #React #Next #CVE-2025-55182 #RSC #入侵 #日志排查 #ServBay #工业级串口服务器 #串口转以太网 #串口设备联网通讯模块 #串口服务器选型 #AI 推理 #NV #Spire.Office #远程软件 #Spring AOP #FL Studio #FLStudio #FL Studio2025 #FL Studio2026 #FL Studio25 #FL Studio26 #水果软件 # OTA升级 # 黄山派 #内网 #静脉曲张 #腿部健康 #ansys #ansys问题解决办法 #人大金仓 #Kingbase # 网络延迟 #快递盒检测检测系统 #WRF #WRFDA #租显卡 #训练推理 #公共MQTT服务器 #代理服务器 #多进程 #python技巧 #分布式数据库 #集中式数据库 #业务需求 #选型误 #防火墙 #claudeCode #content7 #0day漏洞 #DDoS攻击 #漏洞排查 #单例模式 #懒汉式 #恶汉式 #odoo #bigtop #hdp #hue #kerberos #轻量化 #低配服务器 #网络配置实战 #Web/FTP 服务访问 #计算机网络实验 #外网访问内网服务器 #Cisco 路由器配置 #静态端口映射 #网络运维 #docker安装seata # 串口服务器 # NPort5630 #ftp #sftp #基金 #股票 #YOLO识别 #YOLO环境搭建Windows #YOLO环境搭建Ubuntu #OpenHarmony #Python办公自动化 #Python办公 #生产服务器问题查询 #日志过滤 #cpu #clawdbot #rag # ms-swift #PN 结 #决策树 #ossinsight #sglang #超算中心 #PBS #lsf #反向代理 #AE #cocos2d #图形渲染 #adobe #数据迁移 #测速 #iperf #iperf3 #gmssh #宝塔 #Exchange #小智 # 服务器迁移 # 回滚方案 #系统安装 #铁路桥梁 #DIC技术 #箱梁试验 #裂纹监测 #四点弯曲 #开关电源 #热敏电阻 #PTC热敏电阻 #可再生能源 #绿色算力 #风电 #express #cherry studio #期刊 #SCI #游戏服务器断线 #AI Agent #开发者工具 #外卖配送 #计算机外设 #boltbot #边缘AI # Kontron # SMARC-sAMX8 #okhttp #健康医疗 #人脸活体检测 #live-pusher #动作引导 #张嘴眨眼摇头 #苹果ios安卓完美兼容 #remote-ssh #强化学习 #策略梯度 #REINFORCE #蒙特卡洛 #I/O模型 #并发 #水平触发、边缘触发 #多路复用 #AI应用 #L6 #L10 #L9 #高考 #阿里云RDS #Beidou #北斗 #SSR #信息安全 #信息收集 #vrrp #脑裂 #keepalived主备 #高可用主备都持有VIP #软件需求 #H3C #密码 #nmodbus4类库使用教程 # AI部署 #docker-compose #材料工程 #智能电视 #VMware创建虚拟机 #远程更新 #缓存更新 #多指令适配 #物料关联计划 #防毒面罩 #防尘面罩 #Qwen3-VL # 服务状态监控 # 视觉语言模型 #IFix #m3u8 #HLS #移动端H5网页 #APP安卓苹果ios #监控画面 直播视频流 #DooTask #UEFI #BIOS #Legacy BIOS #长文本处理 #GLM-4 #Triton推理 #Socket #gerrit #隐函数 #常微分方程 #偏微分方程 #线性微分方程 #线性方程组 #非线性方程组 #复变函数 # 环境迁移 #KMS 激活 #xshell #host key #UDP服务器 #recvfrom函数 #身体实验室 #健康认知重构 #系统思维 #微行动 #NEAT效应 #亚健康自救 #ICT人 #Ward #思爱普 #SAP S/4HANA #ABAP #NetWeaver #云计算运维 #高精度农业气象 #4U8卡 AI 服务器 ##AI 服务器选型指南 #GPU 互联 #GPU算力 #日志模块 #WAN2.2 #卷积神经网络 #银河麒麟服务器系统 #dash #统信操作系统 #套接字 #I/O多路复用 #字节序 #数据报系统 #idc #效率神器 #办公技巧 #自动化工具 #Windows技巧 #打工人必备 #实时检测 #pxe #free #vmstat #sar #HarmonyOS APP #MinIO #旅游 #spring ai #oauth2 #Cpolar #国庆假期 #服务器告警 #rtmp #dreamweaver #晶振 #AI电商客服 #ROS # 局域网访问 # 批量处理 #运维 # 高温监控 #hdfs #华为od机试 #华为od机考 #华为od最新上机考试题库 #华为OD题库 #华为OD机试双机位C卷 #od机考题库 #Python3.11 #ue4 #DedicatedServer #独立服务器 #专用服务器 #AI工具集成 #容器化部署 #分布式架构 #Matrox MIL #二次开发 #rsync # 数据同步 #vertx #vert.x #vertx4 #runOnContext #CMC #自动化巡检 # DIY主机 # 交叉编译 #istio #服务发现 #jquery #fork函数 #进程创建 #进程终止 #分子动力学 #化工仿真 #session #运动 #JADX-AI 插件 #语义检索 #向量嵌入 #starrocks #OpenAI #故障 #tekton #二值化 #Canny边缘检测 #轮廓检测 #透视变换 #新浪微博 #传媒 #DuckDB #协议 #Arduino BLDC #核辐射区域探测机器人 #esp32 #mosquito #2025年 #FRP #AI教程