STTNet 0.7.0

Demo:UDP 报文回显

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

1. 示例内容

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

2. 构建与运行

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

3. 运行结果

printf "hello" | nc -u -w1 127.0.0.1 9003
预期:返回 hello。

4. 完整源码

#include <sttnet.h>

#include <atomic>
#include <iostream>
#include <thread>

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

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

    // UDP socket 使用一秒接收超时,便于循环
    // 在不使用危险异步 handler 的情况下检查退出标志。
    UdpServer server(7070, false, 1, true);
    if(server.getFD() < 0)
    {
        std::cerr << "failed to bind UDP port 7070\n";
        return 2;
    }

    std::atomic<bool> running{true};
    std::thread signalThread([&running] {
        ServerSetting::waitForTerminationSignal();
        running.store(false, std::memory_order_release);
    });

    std::cout << "UDP echo listening on 127.0.0.1:7070\n";

    while(running.load(std::memory_order_acquire))
    {
        std::string data;
        std::string peerIP;
        int peerPort = 0;

        const int received = server.recvData(data, 64 * 1024, peerIP, peerPort);
        if(received == -100)
            continue; // 接收超时:重新检查退出标志。
        if(received <= 0)
            continue;

        // UDP 保留报文边界;把当前报文回发给发送端。
        const int sent = server.sendData(data, peerIP, peerPort);
        if(sent <= 0)
            std::cerr << "failed to reply to " << peerIP << ':' << peerPort << '\n';
    }

    server.close();
    signalThread.join();
    return 0;
}