Demo:HTTP 最小服务
可构建、可运行、可验证,并与仓库 examples 目录中的源码保持一致。
1. 示例内容
完整源码中的关键调用均有中文注释,页面同时给出运行命令、验证方法和可调整参数。
2. 构建与运行
cmake --build build --target sttnet_http_hello --parallel
./build/examples/sttnet_http_hello3. 运行结果
curl http://127.0.0.1:8080/ping预期:返回 pong。
4. 完整源码
#include <sttnet.h>
#include <iostream>
int main()
{
using namespace stt::network;
using stt::system::ServerSetting;
// 在线程创建前屏蔽 SIGINT 和 SIGTERM。
// 主线程会在程序末尾同步等待这些退出信号。
if(!ServerSetting::blockTerminationSignals())
{
std::cerr << "failed to block termination signals\n";
return 1;
}
// HttpServer 管理监听 socket、Reactor、连接和 Worker。
HttpServer server;
// 注册路由;HttpServer 默认使用 URL 路径作为路由 key。
server.setFunction("/ping",
[](HttpServerFDHandler &client, HttpRequestInformation &) {
// 请求成功处理后返回 1。
// 发送失败且需要关闭连接时返回 -2。
return client.sendText("pong") ? 1 : -2;
});
// 没有匹配已注册路由时,会进入全局回调。
server.setGlobalSolveFunction(
[](HttpServerFDHandler &client, HttpRequestInformation &) {
return client.sendText("not found", "404 Not Found") ? 1 : -2;
});
// 在 TCP 8080 端口启动监听,使用默认 Worker 数量。
if(!server.startListen(8080))
{
std::cerr << "failed to listen on port 8080\n";
return 2;
}
std::cout << "STTNet " << stt::version
<< " listening on http://127.0.0.1:8080\n";
// 在这里等待 Ctrl-C(SIGINT)或 kill -15(SIGTERM)。
ServerSetting::waitForTerminationSignal();
// close() 的流程包括停止接收新连接、等待在途任务和发送队列,
// 最后在正常线程上下文中释放网络资源。
return server.close() ? 0 : 3;
}