STTNet 0.7.0

Demo:HTTP 最小服务

可构建、可运行、可验证,并与仓库 examples 目录中的源码保持一致。

1. 示例内容

完整源码中的关键调用均有中文注释,页面同时给出运行命令、验证方法和可调整参数。

2. 构建与运行

cmake --build build --target sttnet_http_hello --parallel
./build/examples/sttnet_http_hello

3. 运行结果

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