STTNet 0.7.0

第 1 章:运行模型与核心对象

本章介绍线程模型、对象生命周期、发送语义以及主要公开对象之间的关系。

1. STTNet 管理的基础能力

STTNet 封装 Linux epoll、非阻塞 Socket、连接状态、HTTP 报文边界、WebSocket 帧、TLS 对象、跨线程响应队列、背压和优雅退出。应用代码主要围绕“注册回调并处理请求”展开。

对象职责
HttpServer / WebSocketServer / TcpServer拥有监听 Socket、Reactor 线程、连接表、WorkerPool 和运行指标。
Handler当前连接的操作入口,例如发送响应、发送帧或关闭连接。其有效期通常只覆盖当前处理流程。
Request / Information当前请求或消息的解析结果。生命周期通常只覆盖本次处理流程。
WorkerPool执行数据库、文件、RPC、压缩等可能阻塞或耗时的任务。
ServerSetting进程级日志、信号屏蔽、同步等待退出信号等初始化。

2. Reactor 与 Worker 的分工

每个 Server 对象主要由一个 Reactor 线程推进网络事件。startListen(port, threads) 的第二个参数是 WorkerPool 线程数量,不是 Reactor 数量。

Reactor 回调应保持非阻塞。数据库查询、文件读写、sleep、外部 RPC 或不可预测的锁等待会暂停同一事件循环上的其他连接。

3. 发送成功代表什么

服务端回调中的 sendText()sendJson()sendData()sendMessage() 成功,表示数据已经被 STTNet 的有界发送队列接受,并不表示已经写入内核,更不表示对端已经收到。

4. 生命周期和所有权

  • Handler 引用的有效期通常只覆盖当前回调。
  • headerValue()bodyView() 返回非拥有 string_view;跨线程或长期保存场景使用拥有数据的 std::string 副本。
  • 信息结构体中的 ctx 用于保存跨阶段的少量请求状态。
  • 服务级 close() 由主线程或控制线程调用;Reactor 同步回调只处理当前连接或请求。

5. maxFD 与系统限制

HttpServer server(100000) 只表示框架最多跟踪多少连接,不会提高 Linux 文件描述符限制。实际部署容量还取决于进程、systemd 与容器限制:

ulimit -n

容器、systemd 和进程用户也可能分别设置限制。

6. 完整最小程序

#include <sttnet.h>
#include <iostream>

int main()
{
    using namespace stt::network;
    using stt::system::ServerSetting;

    // 退出信号在线程创建前完成屏蔽。
    if(!ServerSetting::blockTerminationSignals())
        return 1;

    HttpServer server;

    server.setFunction("/ping",
        [](HttpServerFDHandler &client, HttpRequestInformation &) {
            // 1:本阶段成功;-2:发送失败并关闭连接。
            return client.sendText("pong") ? 1 : -2;
        });

    if(!server.startListen(8080))
        return 2;

    std::cout << "http://127.0.0.1:8080/ping\n";
    ServerSetting::waitForTerminationSignal();
    return server.close() ? 0 : 3;
}