第 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;
}