STTNet 0.7.0

Demo:TCP 字节流回显

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

1. 示例内容

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

2. 构建与运行

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

3. 运行结果

printf "hello" | nc 127.0.0.1 9002
预期:返回 hello。

4. 完整源码

#include <sttnet.h>

#include <iostream>

class EchoTcpServer final : public stt::network::TcpServer
{
protected:
    // TcpServer 把心跳策略交给派生协议实现。
    // 这个字节回显 Demo 不需要应用层心跳。
    void handleHeartbeat() override {}
};

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

    if(!ServerSetting::blockTerminationSignals())
        return 1;

    EchoTcpServer server;

    // TCP 是字节流:一次回调只代表收到一段字节,
    // 可能只包含一条业务消息的一部分;实际协议需要增加
    // 固定头、长度前缀或分隔符等消息边界。
    server.setGlobalSolveFunction(
        [](TcpFDHandler &client, TcpInformation &info) {
            // 服务端回调中的 sendData() 会把字节提交到有界的
            // Reactor 发送队列,不会阻塞等待对端网络。
            return client.sendData(info.data) > 0;
        });

    if(!server.startListen(6060))
    {
        std::cerr << "failed to listen on port 6060\n";
        return 2;
    }

    std::cout << "TCP echo listening on 127.0.0.1:6060\n";
    ServerSetting::waitForTerminationSignal();
    return server.close() ? 0 : 3;
}